MongoDB
目录
一:什么是MongoDB
1:主要特点
2:MongoDB概念解析
3:完整术语列表
二:MongoDB安装
三:MongoDB Shell
1:安装MongoDB Shell
2:验证MongoDB Shell
四:数据库管理
五:集合管理
1:查看集合
2:创建集合
3:更新集合名
4:删除集合
六:文档操作
1:插入文档
2:查询文档
3:删除文档
4:更新文档
七:MongoDB 备份(mongodump)与恢复(mongorestore)
1:安装备份与恢复命令
2:MongoDB数据备份
3:MongoDB数据恢复
八:MongoDB用户管理
一:什么是MongoDB
MongoDB 是一个文档型数据库,数据以类似JSON 的文档形式存储。MongoDB 的设计理念是为了应对大数据量、高性能和灵活性需求。MongoDB 使用集合(Collections)来组织文档(Documents),每个文档都是由键值对组成
的。
- 数据库(Database):存储数据的容器,类似于关系型数据库中的数据库。
- 集合(Collection):数据库中的一个集合,类似于关系型数据库中的表
- 文档(Document):集合中的一个数据记录,类似于关系型数据库中的行(row),以 BSON 格式存储。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成,文档类似于JSON 对象,字段值可以包含其他文档,数组及文档数组:
1:主要特点
特性类别 | 具体描述 |
---|---|
文档导向的存储 | 以JSON-like格式存储数据,支持灵活和丰富的数据结构。 |
索引优化查询 | 允许为任意属性(如FirstName、Address)创建索引,提升查询效率和排序性能。 |
数据镜像与扩展性 | 通过本地或网络创建数据副本,实现数据冗余和扩展能力。 |
水平扩展与分片 | 通过分片技术将数据分布到多个节点,支持水平扩展以应对高负载。 |
强大的查询语言 | 使用JSON格式的查询语法,支持复杂查询(包括内嵌对象和数组)。 |
数据更新 | 通过update() 命令替换整个文档或更新指定字段,提供灵活的数据更新方式。 |
MapReduce批量处理 | 专为大规模数据处理设计,通过Map函数的emit(key, value) 和Reduce函数实现高效数据汇总。 |
MapReduce脚本编写 | Map和Reduce函数用JavaScript编写,可通过db.runCommand 或mapreduce 命令执行。 |
GridFS大文件存储 | 内置功能,用于存储和检索超过BSON文档大小限制的文件(如图片、视频)。 |
服务端脚本执行 | 支持在服务端执行JavaScript脚本,可直接执行或存储函数定义供后续调用。 |
多语言支持 | 提供多种编程语言支持,包括RUBY、PYTHON、JAVA、C++、PHP、C#等。 |
2:MongoDB概念解析
SQL 术语/概念 | MongoDB 术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表(SQL) / 集合(MongoDB) |
row | document | 数据记录行(SQL) / 文档(MongoDB),MongoDB 使用 JSON-like 格式存储文档 |
column | field | 数据字段(SQL) / 域(MongoDB) |
index | index | 索引,用于加速查询 |
table joins | 表连接(SQL),MongoDB 不支持连接操作,需通过嵌入文档或应用层逻辑实现 | |
primary key | primary key | 主键(SQL),MongoDB 自动将 _id 字段设置为主键 |
3:完整术语列表
概念/功能 | 描述 |
---|---|
文档(Document) | MongoDB的基本数据单元,采用JSON-like结构,支持多种数据类型。 |
集合(Collection) | 类似于SQL中的表,是文档的容器,不要求文档具有固定模式。 |
数据库(Database) | 包含多个集合的MongoDB实例。 |
BSON | Binary JSON的缩写,MongoDB用于存储和传输文档的二进制格式。 |
索引(Index) | 优化查询性能的数据结构,可基于一个或多个字段创建。 |
分片(Sharding) | 将数据分布到多个服务器(分片)以处理大数据集和高吞吐量。 |
副本集(Replica Set) | 一组维护相同数据的MongoDB服务器,提供冗余备份和高可用性。 |
主节点(Primary) | 副本集中处理所有写入操作的服务器。 |
从节点(Secondary) | 副本集中用于读取数据,主节点故障时可接管为主节点。 |
MongoDB Shell | 命令行界面,用于与MongoDB实例交互。 |
聚合框架(Aggregation Framework) | 用于执行复杂数据处理和聚合操作的一系列操作。 |
Map-Reduce | 编程模型,用于并行处理大数据集。 |
GridFS | 存储和检索超过BSON文档大小限制的文件(如图片、视频)。 |
ObjectId | MongoDB为每个文档自动生成的唯一标识符。 |
CRUD操作 | 创建(Create)、读取(Read)、更新(Update)、删除(Delete)操作。 |
事务(Transactions) | 从MongoDB 4.0开始支持,允许一组操作作为原子单元执行。 |
操作符(Operators) | 用于查询和更新文档的特殊字段(如$set 、$inc )。 |
连接(Join) | 通过$lookup 操作符实现类似SQL的连接操作。 |
TTL(Time-To-Live) | 为字段设置过期时间,自动删除旧数据。 |
存储引擎(Storage Engine) | 数据存储管理技术(如WiredTiger、MMAPv1)。 |
MongoDB Compass | 图形界面工具,用于可视化和管理MongoDB数据。 |
MongoDB Atlas | MongoDB提供的云服务,支持在云端托管数据库。 |
二:MongoDB安装
# 安装依赖包
dnf install libcurl openssl -y# 解压安装包
tar -zxvf mongodb-linux-x86_64-rhel8-8.0.8.tgz# 移动安装文件
mv mongodb-linux-x86_64-rhel88-8.0.8 /usr/local/mongodb# 配置环境变量
echo 'export PATH=/usr/local/mongodb/bin:$PATH' >> /etc/profile
source /etc/profile
创建数据库目录
默认情况下 MongoDB 启动后会初始化以下两个目录:
数据存储目录:/var/lib/mongodb
日志文件目录:/var/log/mongodb
# 创建数据目录并设置权限
[root@localhost ~]# mkdir -p /var/lib/mongo
[root@localhost ~]# mkdir -p /var/log/mongodb
[root@localhost ~]# chown `whoami` /var/lib/mongo # 设置权限
[root@localhost ~]# chown `whoami` /var/log/mongodb # 设置权限# 安装OpenSSL依赖
[root@localhost ~]# dnf install -y gcc make perl
[root@localhost ~]# tar xzf openssl-1.1.1w.tar.gz
[root@localhost ~]# cd openssl-1.1.1w
[root@sentinel01 openssl-1.1.1w]# ./config --prefix=/opt/openssl --openssldir=/opt/openssl/ssl
[root@sentinel01 openssl-1.1.1w]# make -j$(nproc)
[root@sentinel01 openssl-1.1.1w]# make install# 设置OpenSSL环境变量
[root@localhost ~]# echo 'export LD_LIBRARY_PATH=/opt/openssl/lib:$LD_LIBRARY_PATH' | sudo tee /etc/profile.d/openssl.sh
[root@localhost ~]# source /etc/profile.d/openssl.sh# 启动MongoDB服务
[root@localhost ~]# mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork# 成功启动输出示例
about to fork child process, waiting until server is ready for connections.
forked process: 12102
child process started successfully, parent exiting
三:MongoDB Shell
MongoDB Shell 是 MongoDB 提供的官方交互式界面,允许用户与 MongoDB 数据库进行交互、执行命令和操作数据库。
MongoDB Shell 是基于 JavaScript 的,允许用户直接在命令行或者脚本中使用 JavaScript 语言来操作 MongoDB 数据库。
1:安装MongoDB Shell
# 解压安装包
[root@localhost ~]# tar xzf mongosh-2.5.0-linux-x64-openssl3.tgz# 进入解压目录
[root@localhost ~]# cd mongosh-2.5.0-linux-x64-openssl3
[root@localhost mongosh-2.5.0-linux-x64-openssl3]# cd bin/# 复制文件到系统目录
[root@localhost bin]# cp mongosh /usr/local/bin/
[root@localhost bin]# cp mongosh_crypt_v1.so /usr/local/lib/
2:验证MongoDB Shell
# 连接MongoDB服务器
mongosh --host <hostname> --port <port>
说明:
- - mongosh: 启动 MongoDB Shell 命令行工具。
- - --host <hostname>: 指定 MongoDB 服务器的主机名或 IP 地址。
- - <hostname>: MongoDB 服务器的主机名(如 localhost)或 IP 地址(如 127.0.0.1)。
- - --port <port>: 指定 MongoDB 服务器的端口号。
- - <port>: MongoDB 服务器监听的端口号,默认端口是 27017。
四:数据库管理
操作类型 | 命令/方法 | 说明 | 示例 |
---|---|---|---|
查看数据库列表 | show dbs | 显示当前MongoDB实例中所有非空数据库(系统库默认显示) | > show dbs admin 40.00 KiB config 60.00 KiB local 40.00 KiB |
查看当前数据库 | db | 显示当前正在使用的数据库 | > db runoob |
创建数据库 | use DATABASE_NAME | 切换到指定数据库,若不存在则自动创建(需插入数据后才会显示) | > use mydb > db.coll.insertOne({name: "Alice"}) |
删除数据库 | db.dropDatabase() | 删除当前数据库及其所有集合(需先切换到目标数据库) | > use mydb > db.dropDatabase() { ok: 1, dropped: 'mydb' } |
默认数据库 | test | 未指定数据库时,MongoDB默认使用test 数据库存储数据 | > db.coll.insertOne({x: 1}) // 默认存入test |
系统内置数据库 | admin | 存储用户权限和全局管理信息(如创建用户、集群配置) | > use admin > db.createUser(...) |
config | 仅在分片集群中存在,存储分片元数据(如分片键、块分布) | > use config > db.shards.find() | |
local | 存储副本集状态和操作日志(oplog),数据不复制到其他节点 | > use local > db.oplog.rs.find() |
五:集合管理
1:查看集合
查看当前库已有集合,可以使用show collections 或show tables命令
2:创建集合
MongoDB 中使用 `createCollection()` 方法来创建集合。
语法格式:
db.createCollection(name, options)
参数说明:
- name: 要创建的集合名称(字符串类型,必填)
- options: 可选参数,指定有关内存大小及索引的选项(文档类型)
options 可以是如下参数:
参数名 | 类型 | 描述 | 示例值 |
---|---|---|---|
capped | 布尔值 | 是否创建固定大小的集合(循环覆盖旧数据) | true |
size | 数值 | 集合的最大字节大小(仅在capped为true时有效) | 10485760 (10MB) |
max | 数值 | 集合允许的最大文档数(仅在capped为true时有效) | 5000 |
validator | 对象 | 文档验证规则(使用JSON Schema语法) | { $jsonSchema: { bsonType: "object", required: ["name"] } } |
validationLevel | 字符串 | 验证严格程度:"off" : 不验证"strict" : 插入和更新都验证(默认)"moderate" : 仅更新时验证 | "strict" |
validationAction | 字符串 | 验证失败时的处理:"error" : 拒绝操作(默认)"warn" : 允许但记录警告 | "error" |
storageEngine | 对象 | 指定存储引擎配置 | { wiredTiger: { configString: "block_compressor=zstd" } } |
collation | 对象 | 指定字符串排序规则(如语言、大小写敏感等) | { locale: "en", strength: 2 } |
在插入文档时,MongoDB 首先检查固定集合的 size字段,然后检査 max 字段。
使用这些选项创建一个集合的实例:
> db.createCollection("myComplexCollection", {capped: true, // 固定集合size: 10485760, // 大小限制(10MB)max: 5000, // 文档数量限制validator: { // 文档验证规则$jsonSchema: {bsonType: "object",required: ["name", "email"],properties: {name: {bsonType: "string",description: "必须为字符串且为必填项"},email: {bsonType: "string",pattern: ".+@.+$", // 邮箱格式验证description: "必须为有效的电子邮件地址"}}}},validationLevel: "strict", // 严格验证级别validationAction: "error", // 验证失败时抛出错误storageEngine: { // 存储引擎配置wiredTiger: { configString: "block_compressor=zstd" }},collation: { // 排序规则locale: "en", strength: 2 }
});
这个例子创建了一个集合,具有以下特性:
固定大小,最大 10MB,最多存储 5000个文档。
文档必须包含必须是字符串,email必须是有效和email 字段,其中namename的电子邮件格式。
验证级别为严格,验证失败将阻止插入或更新。
使用 WiredTiger 存储引擎,指定块压缩器为 zstd。
默认使用英语排序规则。
实例
在 test 数据库中创建 runoob 集合:
> use test
switched to db test
> db.createCollection("runoob")
{ "ok" : 1 }
注意: 在 MongoDB 中,集合只有在内容插入后才会创建,就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。
3:更新集合名
在 MongoDB 中,不能直接通过命令来重命名集合。
MongoDB 可以使用 renameCollection 方法来来重命名集合。
// MongoDB 集合重命名命令语法
> db.adminCommand({renameCollection: "sourceDb.sourceCollection", // 原集合全名(数据库.集合)to: "targetDb.targetCollection", // 目标集合全名dropTarget: <boolean> // 是否覆盖目标集合(true/false)
})
参数说明:
- renameCollection:要重命名的集合的完全限定名称(包括数据库名)。
- to:目标集合的完全限定名称(包括数据库名)。
- dropTarget(可选):布尔值。如果目标集合已经存在,是否删除目标集合。默认值为false。
4:删除集合
MongoDB 中使用 drop()方法来删除集合。
drop()方法可以永久地从数据库中删除指定的集合及其所有文档,这是一个不可逆的操作,因此需要谨慎使用。
语法格式:
db.collection 名称.drop()
如果成功删除选定集合,则 drop()方法返回 true,否则返回 false。
六:文档操作
1:插入文档
方法 | 用途 | 是否弃用 |
---|---|---|
insertOne() | 插入单个文档 | 否 |
insertMany() | 插入多个文档 | 否 |
insert() | 插入单个或多个文档 | 是 |
save() | 插入或更新文档 | 是 |
在 MongoDB 中,插入文档时如果集合(Collection)不存在,数据库会自动创建该集合。这是 MongoDB 的默认行为,也是其无模式设计(Schema-less)的核心特性之一
2:查询文档
方法 | 语法格式 | 返回结果 | 查询条件 | 字段投影 | 使用场景 |
---|---|---|---|---|---|
find() | db.collection.find(query, projection) | 返回游标对象(可迭代) | 可选,默认为{} (匹配所有文档) | 可选,控制返回字段 | 需要获取多个匹配文档时使用 |
findOne() | db.collection.findOne(query, projection) | 返回单个文档/null | 可选,默认为{} (匹配所有文档) | 可选,控制返回字段 | 只需获取第一个匹配文档时使用 |
3:删除文档
方法 | 语法格式 | 功能描述 | 返回值 | 使用场景 |
---|---|---|---|---|
deleteOne() | db.collection.deleteOne(filter, options) | 删除第一个匹配的文档 | {acknowledged: bool, deletedCount: number} | 精确删除单个文档(如按ID删除) |
deleteMany() | db.collection.deleteMany(filter, options) | 删除所有匹配的文档 | {acknowledged: bool, deletedCount: number} | 批量清理数据(如过期日志删除) |
findOneAndDelete() | db.collection.findOneAndDelete(filter, options) | 查找并删除一个文档,可返回被删文档 | 被删除的文档(或null) | 需要记录被删内容的场景 |
4:更新文档
方法 | 语法格式 | 功能描述 | 返回值 | 核心特点 |
---|---|---|---|---|
updateOne() | db.collection.updateOne(filter, update, options) | 更新第一个匹配的文档 | {acknowledged: bool, matchedCount: number, modifiedCount: number} | 支持操作符($set 等),可配置upsert |
updateMany() | db.collection.updateMany(filter, update, options) | 更新所有匹配的文档 | {acknowledged: bool, matchedCount: number, modifiedCount: number} | 批量更新,支持相同操作符 |
replaceOne() | db.collection.replaceOne(filter, replacement, options) | 完全替换匹配的第一个文档 | {acknowledged: bool, matchedCount: number, modifiedCount: number} | 替换整个文档(非字段级更新) |
findOneAndUpdate() | db.collection.findOneAndUpdate(filter, update, options) | 查找并更新一个文档,可返回文档 | 默认返回更新前的文档(可配置返回更新后) | 支持排序/投影等高级选项 |
七:MongoDB 备份(mongodump)与恢复(mongorestore)
1:安装备份与恢复命令
[root@localhost ~]# rpm -ivh mongodb-database-tools-rhel70-x86_64-100.12.0.rpm
2:MongoDB数据备份
mongodump -h dbhost -d dbname -o dbdirectory
- -h:MongoDB 所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1 :27017
- -d:需要备份的数据库实例,例如:test
- -o:备份的数据存放位置,例如:/data/dump,当然该目录需要提前建立,在备份完成后,系统自动在 dump 目录下建立一个 test 目录,这个目录里面存放该数据库实例的备份数据。
[root@localhost ~]#mongodump
mongodump 命令可选参数列表如下所示:
语法 | 描述 | 实例 |
---|---|---|
mongodump --host HOST_NAME --port PORT_NUMBER | 备份所有MongoDB数据 | mongodump --host runoob.com --port 27017 |
mongodump --dbpath DB_PATH --out BACKUP_DIRECTORY | 从指定数据目录备份 | mongodump --dbpath /data/db/ --out /data/backup/ |
mongodump --collection COLLECTION --db DB_NAME | 备份指定数据库的集合 | mongodump --collection mycol --db test |
3:MongoDB数据恢复
mongodb 使用 mongorestore 命令来恢复备份的数据。
> mongorestore -h <hostname>:<port> -d dbname <path>
- --host <:port>,-h <:port>: MongoDB所在服务器地址,默认为:localhost:27017
- --db ,-d :需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如 test2
- --drop:恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!
- <path>:mongorestore 最后的一个参数,设置备份数据所在位置,例如:c:\data\dump\test。你不能同时指定<path〉和 --dir 选项,--dir 也可以设置备份目录。
- --dir:指定备份的目录,你不能同时指定<path>和--dir 选项
[root@localhost ~]# mongorestore
mongorestore默认会从当前执行命令的路径下的dump目录中读取备份数据
八:MongoDB用户管理
# 连接MongoDB
mongosh# 切换数据库
use test# 创建用户
db.createUser({user: "testuser",pwd: "password123",roles: [{ role: "readWrite", db: "test" }, // 读写权限{ role: "dbAdmin", db: "test" } // 数据库管理权限]
})# 验证用户
db.auth("testuser", "password123") // 返回1表示成功# 启用认证(二选一)
# 方法1: 修改配置文件
security:authorization: "enabled"# 方法2: 启动时加参数
mongod --auth --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork# 认证登录
mongosh --host localhost --port 27017 -u "testuser" -p "password123" --authenticationDatabase "test"# 删除用户
db.dropUser("testuser")