站内链接:

安装配置

mac

  1. mac 上的安装和启动
1
2
3
4
5
6
7
8
9
10
11
12
13
# install
brew install mongodb

# Set mongodb path
echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.zshrc

# Start
brew services start mongodb
# 手动启动
mongod

# Mongo Client
mongo
  1. mac 上通过 docker 安装
1
2
3
4
5
# 1. 拉取最新镜像或者指定版本
docker pull mongodb

# 2. 以nopasswd方式启动mongodb服务
docker run -dt --name mongodb_nopasswd -p 27017:27017 -v /data/db/mongodb/data:/data/other mongo:latest

centos

注意,安装的 mongo 4 版本。

  1. 编辑sudo vi /etc/yum.repos.d/mongodb-org.repo
1
2
3
4
5
6
[mongodb-org]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc
  1. 安装 mongodb-org 元软件包:sudo dnf install mongodb-org,其安装的包介绍如下:
  • mongodb-org-server: 这是 mongod 守护进程,负责运行 MongoDB 数据库服务器。它是 MongoDB 的核心组件,负责处理客户端请求、存储数据以及执行数据库操作等功能。该软件包还包含了相关的初始化脚本和配置文件。
  • mongodb-org-mongos: 这是 mongos 守护进程,用于支持 MongoDB 的分片功能。mongos 进程通常作为路由器使用,它接收来自客户端的请求,并将它们路由到相应的分片服务器上。它帮助实现 MongoDB 的水平扩展和负载均衡。
  • mongodb-org-shell: 这是 mongo shell 工具,它提供了一个交互式的 JavaScript 界面,用于与 MongoDB 数据库进行交互和执行管理任务。通过 mongo shell,用户可以使用命令行方式操作数据库,执行查询、插入、更新、删除等操作,以及执行一些管理和监控任务。
  • mongodb-org-tools: 该软件包包含了一些有用的 MongoDB 工具,用于辅助开发、管理和维护 MongoDB 数据库。这些工具包括数据导入工具(如 mongoimport)、数据导出工具(如 mongoexport)、数据统计工具(如 mongostat)等。这些工具提供了丰富的功能,用于数据的导入导出、备份还原、性能监控等操作。
  1. 启动并配置开机启动
1
2
3
sudo systemctl start mongod
sudo systemctl status mongod
sudo systemctl enable mongod

测试是否成功: mongo --eval 'db.runCommand({ connectionStatus: 1 })'

1
2
3
[root@VM-28-16-opencloudos ~]# lsof -i:27017
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mongod 1948319 mongod 10u IPv4 12039532 0t0 TCP VM-28-16-opencloudos:27017 (LISTEN)

基本配置

  1. 开启用户鉴权,启用 Role-Based Access Control (RBAC),它规定了用户对数据和操作的访问规则,vim /etc/mongod.conf
1
2
3
4
5
6
security:
authorization: enabled

net:
port: 27017
bindIp: 0.0.0.0

更改配置之后需要重启:sudo systemctl restart mongod

  1. 创建一个用户,进入交互终端:mongo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 使用数据库admin,若没有则自动创建
use admin;
show databases;

# 查看collection,注意,mongodb没有传统数据库的表概念,每一个数据库都包含很多集合,集合是动态创建的,只有在插入文档后才会真正创建。所以,通常情况下集合是非常少的
show collections;

# 查看某个集合中的所有信息
db.getCollection('system.version').find()

# 创建
show users;
db.createUser(
{
user: "bambooAdmin",
pwd: "bambooMe",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
show users;
  1. 使用指定用户登录
1
2
3
4
mongo -u bambooAdmin -p --authenticationDatabase admin

use admin
show users;

命令工具

归类

  • mongod:启动 MongoDB 数据库服务器。
  • mongo:启动 MongoDB 的 shell 客户端,用于与 MongoDB 交互、执行查询和管理任务。
  • mongos:启动 MongoDB 的分片路由器,用于支持分片集群。
  • mongodump:用于备份 MongoDB 数据库。可以将整个数据库或指定集合的数据导出到文件中。
  • mongorestore:用于恢复 MongoDB 数据库备份。可以从备份文件中导入数据并恢复数据库。
  • mongoimport:用于将数据导入到 MongoDB 数据库。可以从文件或标准输入中读取数据,并将其导入到指定的集合中。
  • mongoexport:用于导出 MongoDB 数据库中的数据。可以将指定集合的数据导出到文件中或者标准输出。
  • mongostat:用于监视 MongoDB 实例的状态。可以显示实例的各种统计信息,如连接数、操作数、响应时间等。
  • mongotop:用于监视 MongoDB 实例的读写操作。可以显示操作类型、集合名称以及操作的耗时。
  • mongooplog:用于回放 MongoDB 实例的操作日志。可以将操作日志文件应用于目标 MongoDB 实例,以重现操作。
  • mongofiles:用于在 MongoDB GridFS 中存储和检索文件。

备份和恢复

  1. 备份

mongodb 常见的备份操作有三种: mongodump, 系统快照, cp/rsync, 这里仅仅介绍 mongodump 备份工具的使用, 其和 mongorestore 互相配合完成数据的备份和恢复.

  • mongodump 在运行时要尽量先关闭业务, 否则容易出现错误. 另外, mongodump 仅仅备份数据库中的文档, 不会备份索引信息.
  • mongodump 适用于备份小型的 mongodb 数据库, 不适用于大型数据库的备份

该命令的格式为: mongodump [options],其常用选项如下:

  • --host:指定 MongoDB 服务器的主机名或 IP 地址。
  • --port:指定 MongoDB 服务器的端口号。
  • --username:指定连接 MongoDB 服务器的用户名。
  • --password:指定连接 MongoDB 服务器的密码。
  • --db:指定要备份的数据库名称,若不指定则默认备份所有的数据库
  • --collection:指定要备份的集合名称。
  • --out:指定备份文件输出的目录路径。

例如, 执行命令mongodump --db test之后会在当前目录生成一个dump/elm文件夹, 文件夹中的信息如下:

1
2
3
4
5
6
7
8
9
# 其中每个bson表示一个集合概念
elm
├── activities.bson
├── activities.metadata.json
├── addresses.bson
├── addresses.metadata.json
├── admins.bson
├── admins.metadata.json
...

后续就可以直接使用生成的文件夹进行数据的恢复操作.

  1. 恢复

mongorestore 用于创建新的数据库或将数据添加到现有的数据库, 其只会执行insert操作, 若数据库中某个表本身就有数据, 则可能发生 ID 冲突的问题. 另外, mongorestore 也会完成索引的重建工作. mongorestore 命令的基本用法:mongorestore <options> <dir>,其中<options> 是可选的命令选项,用于配置导入过程, <dir> 是包含备份数据的目录路径:

  • --host <hostname>:指定 MongoDB 服务器的主机名或 IP 地址。
  • --port <port>:指定 MongoDB 服务器的端口号。
  • --username <username>:使用指定的用户名进行身份验证。
  • --password <password>:使用指定的密码进行身份验证。
  • --authenticationDatabase <database>:指定用于身份验证的数据库。
  • --db <database>:指定要导入数据的目标数据库。
  • --collection <collection>:指定要导入数据的目标集合。
  • --drop:在导入数据之前先删除目标集合中的所有文档。
  • --gzip:导入时对备份数据进行压缩解压缩。
  • --dryRun:执行模拟运行,不进行实际的导入操作,用于检查备份数据的有效性。

其他选项见官方文档. 下面是一个在 docker 容器中恢复 mongodb 数据的示例, 用于恢复开源项目node-elm中的数据:

1
2
3
# 拷贝elm.zip到容器数据库目录中以便容器中可以操作, 进入容器执行如下代码
unzip elm.zip
mongorestore -d test2 dump/test2/

导入和导出

原始数据:

1
2
3
4
5
6
7
8
9
10
11
> db.computer.find()
{ "_id" : ObjectId("64ae25395e5257f455ff90e8"), "name" : "mac", "system" : "macOS", "price" : 12000, "color" : "silver" }
{ "_id" : ObjectId("64ae2afbe83b23b8ad5138db"), "name" : "xiaomi", "system" : "Window", "price" : 6000, "color" : "silver" }

> db.people.find()
{ "_id" : 1, "name" : "A", "personloc" : { "type" : "Point", "coordinates" : [ 116.403981, 39.914935 ] } }
{ "_id" : 2, "name" : "B", "personloc" : { "type" : "Point", "coordinates" : [ 116.433733, 39.909511 ] } }
{ "_id" : 3, "name" : "C", "personloc" : { "type" : "Point", "coordinates" : [ 116.488781, 39.949901 ] } }
{ "_id" : 4, "name" : "D", "personloc" : { "type" : "Point", "coordinates" : [ 116.342609, 39.948021 ] } }
{ "_id" : 5, "name" : "E", "personloc" : { "type" : "Point", "coordinates" : [ 116.328236, 39.901098 ] } }
{ "_id" : 6, "name" : "F", "personloc" : { "type" : "Point", "coordinates" : [ 116.385728, 39.871645 ] } }
  1. 导出

mongoexport 用于将 MongoDB 数据库中的数据导出到文件中。其基本用法:mongoexport <options> --collection <collection> --db <database> --out <filename>,其中

  • <options> 是可选的命令选项,用于配置导出过程
  • <collection> 是要导出的集合名称, 注意,这是必选项
  • <database> 是要导出的数据库名称, 注意,这是必选项
  • <filename> 是导出数据的目标文件路径,若不指定则默认为 stdout

对于 options,其可选项如下:

  • --host <hostname>:指定 MongoDB 服务器的主机名或 IP 地址。
  • --port <port>:指定 MongoDB 服务器的端口号。
  • --username <username>:使用指定的用户名进行身份验证。
  • --password <password>:使用指定的密码进行身份验证。
  • --authenticationDatabase <database>:指定用于身份验证的数据库。
  • --query <query>:指定导出数据的查询条件。
  • --fields <fields>:指定要导出的字段。
  • --type <type>:指定导出的数据类型,如 JSON、CSV 等,默认为 JSON。
  • --csv:导出为 CSV 格式。
  • --jsonArray:导出为一个包含多个 JSON 文档的数组。
  • --pretty:以格式化的方式导出 JSON 数据。
  • --limit <limit>:指定要导出的文档数量的上限。

注意,导出和备份的区别:

  • 功能不同:mongoexport 用于导出指定集合的数据,可以导出为 JSON、CSV 等格式,也可以指定导出的字段和查询条件;而 mongodump 用于导出整个 MongoDB 数据库,包括所有集合和索引。
  • 导出粒度不同:mongoexport 可以导出指定集合中的数据,你可以通过查询条件和字段选择来控制导出的数据;而 mongodump 导出的是整个数据库,包括所有集合和索引,无法进行过滤和选择。

例如:

1
2
3
4
5
6
# 注意, 默认导出JSON
mongoexport --db locationDB --collection people --out data/locationDB-people.json
mongoexport --db locationDB --collection computer --out data/locationDB-computer.json

# 导出特定的fields,注意_id会自动录入
mongoexport --db locationDB --collection computer --fields name,price --out data/locationDB-computer-field.json
  1. 导入

mongoimport用于将数据从文件导入到 MongoDB 数据库中,其基本用法:mongoimport <options> --collection <collection> --db <database> --file <filename>,其中

  • <options> 是可选的命令选项,用于配置导入过程
  • <collection> 是目标集合的名称
  • <database> 是目标数据库的名称
  • <filename> 是包含要导入数据的文件路径

其中 options 的可选项值为:

  • --host <hostname>:指定 MongoDB 服务器的主机名或 IP 地址。
  • --port <port>:指定 MongoDB 服务器的端口号。
  • --username <username>:使用指定的用户名进行身份验证。
  • --password <password>:使用指定的密码进行身份验证。
  • --authenticationDatabase <database>:指定用于身份验证的数据库。
  • --type <type>:指定导入的数据类型,如 JSON、CSV 等,默认为 JSON。
  • --headerline:如果导入的数据文件包含头部行,则将其视为字段名。
  • --drop:在导入数据之前先删除目标集合中的所有文档。
  • --upsert:如果导入的数据与目标集合中的文档有重复,则进行更新操作。
  • --jsonArray:指定导入的数据文件是一个 JSON 数组。
  • --mode <mode>:指定导入的数据模式,如 insert、merge、upsert 等。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
db.computer.drop()
# a. 导入已经存在相同数据的collection
[root@VM-28-16-opencloudos ~]# mongoimport --db locationDB --collection computer --file data/locationDB-computer.json
2023-07-12T12:14:18.887+0800 connected to: mongodb://localhost/
2023-07-12T12:14:18.888+0800 continuing through error: E11000 duplicate key error collection: locationDB.computer index: _id_ dup key: { _id: ObjectId('64ae25395e5257f455ff90e8') }
2023-07-12T12:14:18.888+0800 0 document(s) imported successfully. 1 document(s) failed to import.

# b. 先删除再导入
db.computer.drop()

[root@VM-28-16-opencloudos ~]# mongoimport --db locationDB --collection computer --file data/locationDB-computer.json
2023-07-12T12:15:26.147+0800 connected to: mongodb://localhost/
2023-07-12T12:15:26.183+0800 1 document(s) imported successfully. 0 document(s) failed to import.

数据库信息

版本信息

system.version 是 MongoDB 内部的一个特殊集合,用于存储 MongoDB 实例的版本信息。该集合位于 admin 数据库中,每个实例只有一条记录。

  • _id:记录的标识符,固定为version
  • version:MongoDB 的版本号。
  • gitVersion:MongoDB 的 Git 版本号。
  • modules:MongoDB 使用的模块列表。
  • versionArray:MongoDB 版本号的数组表示,按照主版本、次版本、修订版本和构建版本的顺序排列。
  • openssl:OpenSSL 的版本信息,包括运行时和编译时的版本。

例如,一个简单的输出如下:

1
2
> db.getCollection('system.version').find()
{ "_id" : "featureCompatibilityVersion", "version" : "4.4" }

角色

  1. admin 数据库中可用的角色
  • readWriteAnyDatabase:在所有数据库中具有读写权限。
  • dbAdminAnyDatabase:可以在所有数据库上执行管理操作,如创建和删除数据库。
  • userAdminAnyDatabase:可以在所有数据库中管理用户和角色。
  • clusterAdmin:可以执行集群级别的管理操作,如添加和删除分片、管理复制集。
  • backup:可以执行备份和还原操作。
  • restore:可以执行恢复操作。

用户信息

  1. 创建用户:

    1
    2
    3
    4
    5
    db.createUser({
    user: "username",
    pwd: "password",
    roles: [{ role: "role", db: "database" }]
    })
  2. 删除用户:

    1
    db.dropUser("username")
  3. 修改用户密码:

    1
    db.changeUserPassword("username", "newPassword")
  4. 修改用户角色:

    1
    2
    3
    db.updateUser("username", {
    roles: [{ role: "newRole", db: "database" }]
    })
  5. 查询用户信息:

    1
    db.getUsers()

请注意,以上命令中的参数需要根据实际情况进行替换,包括用户名、密码、角色和数据库名称。用户的增删改查操作需要在具有管理员权限的数据库连接下执行。

SRV

SRV 记录(Service record)是用于指定服务的位置的 DNS 记录类型。它提供了与特定服务关联的服务器的域名、端口和优先级信息。SRV 记录通常用于指定网络服务的位置,例如电子邮件服务器、聊天服务器、语音通信服务器等。

  1. 服务名称(Service):指定服务的协议和服务类型,例如”_smtp._tcp”表示 SMTP 服务。
  2. 优先级(Priority):指定优先级顺序,较低的数字表示较高的优先级。
  3. 权重(Weight):用于在相同优先级的服务器中分配负载均衡,数值越高表示被选中的机会越大。
  4. 端口(Port):指定服务运行的端口号。
  5. 目标(Target):指定提供该服务的服务器的域名。

术语

文档

文档是数据库中存储数据的基本单位。它是一个键值对的集合,类似于关系型数据库中的行或记录。文档使用 JSON(JavaScript Object Notation)格式表示,可以包含不同类型的数据,如字符串、整数、浮点数、布尔值、数组和嵌套的文档。

MongoDB 的文档结构是灵活的,不需要预先定义表结构。这意味着在同一集合(类似于关系数据库中的表)中的文档可以具有不同的字段和结构,没有固定的模式限制。

每个文档在集合中都有一个唯一的”_id”字段,用于标识该文档。”_id”字段可以手动指定,也可以由 MongoDB 自动生成。

文档是 MongoDB 数据模型的核心,它们可以嵌套和索引,使得 MongoDB 非常适合处理半结构化数据和灵活的数据模式。通过使用文档,MongoDB 能够提供高度的扩展性、性能和灵活性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"_id": ObjectId("615bcadf4bba9cbe508a4e6c"),
"name": "John Smith",
"age": 30,
"email": "john.smith@example.com",
"address": {
"street": "123 Main St",
"city": "New York",
"state": "NY",
"zipcode": "10001"
},
"interests": ["reading", "traveling", "photography"],
"is_active": true
}

其中:

  • _id:是文档的唯一标识符,由 MongoDB 自动生成的 ObjectId,不需要主动指定
  • name:存储了一个字符串类型的姓名。
  • age:存储了一个整数类型的年龄。
  • email:存储了一个字符串类型的电子邮件地址。
  • address:是一个嵌套文档,包含了地址相关的字段,如街道、城市、州和邮编。
  • interests:是一个数组类型的字段,存储了多个兴趣爱好。
  • is_active:存储了一个布尔类型的值,表示用户是否处于活跃状态。

参考