数据库:mongo基本特征
站内链接:
安装配置
mac
- mac 上的安装和启动
1 | # install |
- mac 上通过 docker 安装
1 | # 1. 拉取最新镜像或者指定版本 |
centos
注意,安装的 mongo 4 版本。
- 编辑
sudo vi /etc/yum.repos.d/mongodb-org.repo
1 | [mongodb-org] |
- 安装 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 | sudo systemctl start mongod |
测试是否成功: mongo --eval 'db.runCommand({ connectionStatus: 1 })'
1 | [root@VM-28-16-opencloudos ~]# lsof -i:27017 |
基本配置
- 开启用户鉴权,启用 Role-Based Access Control (RBAC),它规定了用户对数据和操作的访问规则,
vim /etc/mongod.conf
1 | security: |
更改配置之后需要重启:sudo systemctl restart mongod
- 创建一个用户,进入交互终端:
mongo
1 | # 使用数据库admin,若没有则自动创建 |
- 使用指定用户登录
1 | mongo -u bambooAdmin -p --authenticationDatabase admin |
命令工具
归类
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 中存储和检索文件。
备份和恢复
- 备份
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 | # 其中每个bson表示一个集合概念 |
后续就可以直接使用生成的文件夹进行数据的恢复操作.
- 恢复
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 | # 拷贝elm.zip到容器数据库目录中以便容器中可以操作, 进入容器执行如下代码 |
导入和导出
原始数据:
1 | > db.computer.find() |
- 导出
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 | # 注意, 默认导出JSON |
- 导入
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 | db.computer.drop() |
数据库信息
版本信息
system.version
是 MongoDB 内部的一个特殊集合,用于存储 MongoDB 实例的版本信息。该集合位于 admin
数据库中,每个实例只有一条记录。
_id
:记录的标识符,固定为version
。version
:MongoDB 的版本号。gitVersion
:MongoDB 的 Git 版本号。modules
:MongoDB 使用的模块列表。versionArray
:MongoDB 版本号的数组表示,按照主版本、次版本、修订版本和构建版本的顺序排列。openssl
:OpenSSL 的版本信息,包括运行时和编译时的版本。
例如,一个简单的输出如下:
1 | > db.getCollection('system.version').find() |
角色
- admin 数据库中可用的角色
readWriteAnyDatabase
:在所有数据库中具有读写权限。dbAdminAnyDatabase
:可以在所有数据库上执行管理操作,如创建和删除数据库。userAdminAnyDatabase
:可以在所有数据库中管理用户和角色。clusterAdmin
:可以执行集群级别的管理操作,如添加和删除分片、管理复制集。backup
:可以执行备份和还原操作。restore
:可以执行恢复操作。
用户信息
创建用户:
1
2
3
4
5db.createUser({
user: "username",
pwd: "password",
roles: [{ role: "role", db: "database" }]
})删除用户:
1
db.dropUser("username")
修改用户密码:
1
db.changeUserPassword("username", "newPassword")
修改用户角色:
1
2
3db.updateUser("username", {
roles: [{ role: "newRole", db: "database" }]
})查询用户信息:
1
db.getUsers()
请注意,以上命令中的参数需要根据实际情况进行替换,包括用户名、密码、角色和数据库名称。用户的增删改查操作需要在具有管理员权限的数据库连接下执行。
SRV
SRV 记录(Service record)是用于指定服务的位置的 DNS 记录类型。它提供了与特定服务关联的服务器的域名、端口和优先级信息。SRV 记录通常用于指定网络服务的位置,例如电子邮件服务器、聊天服务器、语音通信服务器等。
- 服务名称(Service):指定服务的协议和服务类型,例如”_smtp._tcp”表示 SMTP 服务。
- 优先级(Priority):指定优先级顺序,较低的数字表示较高的优先级。
- 权重(Weight):用于在相同优先级的服务器中分配负载均衡,数值越高表示被选中的机会越大。
- 端口(Port):指定服务运行的端口号。
- 目标(Target):指定提供该服务的服务器的域名。
术语
文档
文档是数据库中存储数据的基本单位。它是一个键值对的集合,类似于关系型数据库中的行或记录。文档使用 JSON(JavaScript Object Notation)格式表示,可以包含不同类型的数据,如字符串、整数、浮点数、布尔值、数组和嵌套的文档。
MongoDB 的文档结构是灵活的,不需要预先定义表结构。这意味着在同一集合(类似于关系数据库中的表)中的文档可以具有不同的字段和结构,没有固定的模式限制。
每个文档在集合中都有一个唯一的”_id”字段,用于标识该文档。”_id”字段可以手动指定,也可以由 MongoDB 自动生成。
文档是 MongoDB 数据模型的核心,它们可以嵌套和索引,使得 MongoDB 非常适合处理半结构化数据和灵活的数据模式。通过使用文档,MongoDB 能够提供高度的扩展性、性能和灵活性。
1 | { |
其中:
_id
:是文档的唯一标识符,由 MongoDB 自动生成的 ObjectId,不需要主动指定name
:存储了一个字符串类型的姓名。age
:存储了一个整数类型的年龄。email
:存储了一个字符串类型的电子邮件地址。address
:是一个嵌套文档,包含了地址相关的字段,如街道、城市、州和邮编。interests
:是一个数组类型的字段,存储了多个兴趣爱好。is_active
:存储了一个布尔类型的值,表示用户是否处于活跃状态。