目录
简介
MongoDB 作为现代应用开发中最流行的非关系型数据库之一,以其灵活的数据模型和强大的扩展能力,在大数据和高并发场景中展现出独特优势。本文将从基础概念出发,逐步深入到安装配置、核心操作和高级管理,为你构建完整的 MongoDB 知识体系。
一、MongoDB 的概念与特点
1.1 什么是 MongoDB
MongoDB 是一个基于文档存储的非关系型数据库(NoSQL),采用类似 JSON 的 BSON(Binary JSON)格式存储数据,打破了传统关系型数据库的表结构限制,提供了极高的数据灵活性。其核心设计理念是应对大数据量、高性能和灵活扩展的需求,特别适合内容管理、实时分析和物联网等场景。
1.2 核心概念映射
MongoDB 的数据模型与传统关系型数据库有对应关系,但更具灵活性:
SQL 术语 |
MongoDB 术语 |
说明 |
database |
database |
数据库容器 |
table |
collection |
文档集合,无需固定模式 |
row |
document |
数据文档,BSON 格式存储 |
column |
field |
文档字段 |
index |
index |
索引,支持任意字段创建 |
primary key |
_id |
主键,自动生成唯一标识符 |
table joins |
不支持 |
采用嵌入式数据模型替代关联 |
1.3 关键特性优势
- 文档导向存储:JSON-like 格式存储,支持嵌套文档和数组,天然适合复杂数据结构
- 灵活索引机制:可对任意字段创建索引,包括单字段、复合字段和地理空间索引
- 水平扩展能力:通过分片(Sharding)技术将数据分布到多个节点,应对海量数据
- 副本集高可用:通过数据镜像实现冗余备份,主从节点自动故障转移
- 强大查询语言:支持丰富的查询操作符,如
$gt
、$in
、$regex
,可查询嵌套对象 - MapReduce 处理:内置大规模数据聚合处理能力,支持 JavaScript 脚本
- GridFS 大文件存储:原生支持存储超过 BSON 限制的文件(如图片、视频)
二、Linux 环境下 MongoDB 安装与配置
2.1 准备工作与依赖安装
首先安装必要的依赖包,确保编译环境和网络支持:
# 安装编译工具和网络库
dnf install libcurl openssl gcc make perl -y
解释:libcurl
用于网络通信,openssl
提供加密支持,gcc/make/perl
用于编译 OpenSSL 和 MongoDB 相关组件。
2.2 下载与解压安装包
从官网下载对应版本的安装包并解压:
# 假设下载的是 8.0.8 版本
tar -zxvf mongodb-linux-x86_64-rhel8-8.0.8.tgz
# 移动到指定安装目录
mv mongodb-linux-x86_64-rhel8-8.0.8 /usr/local/mongodb
2.3 配置环境变量
将 MongoDB 可执行文件路径添加到系统 PATH:
# 写入环境变量配置
echo 'export PATH=/usr/local/mongodb/bin:$PATH' > /etc/profile
# 立即生效配置
source /etc/profile
解释:通过修改 /etc/profile
使所有用户都能访问 mongod
、mongosh
等命令,source
命令无需重启即可生效。
2.4 创建数据与日志目录
# 创建数据存储目录
mkdir -p /var/lib/mongo
# 创建日志文件目录
mkdir -p /var/log/mongodb
# 设置当前用户权限
chown whoami /var/lib/mongo
chown whoami /var/log/mongodb
说明:MongoDB 默认会尝试读取这两个目录,whoami
确保当前用户(通常是 root)有读写权限。
2.5 编译安装 OpenSSL 1.1
# 解压 OpenSSL 源码
tar xzf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
# 配置安装路径
./config -prefix=/opt/openssl11 --openssldir=/opt/openssl/ssl
# 编译并安装(-j$(nproc) 利用多核编译)
make -j$(nproc)
make install
2.6 设置 OpenSSL 环境变量
# 写入动态库路径配置
echo 'export LD_LIBRARY_PATH=/opt/openssl11/lib:$LD_LIBRARY_PATH' | sudo tee /etc/profile.d/openssl11.sh
# 生效配置
source /etc/profile.d/openssl11.sh
2.7 启动 MongoDB 服务
# 后台启动服务,指定数据和日志路径
mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
输出验证:
child process started successfully, parent exiting forked process: 12102
看到上述信息表示服务启动成功,MongoDB 默认监听 27017 端口。
三、MongoDB Shell(mongosh)
3.1 安装 mongosh 工具
# 解压安装包
tar xzf mongosh-2.5.0-linux-x64-openssl3.tgz
cd mongosh-2.5.0-linux-x64-openssl3/bin
# 复制到系统路径
cp mongosh /usr/local/bin/
cp mongosh_crypt_v1.so /usr/local/lib/
3.2 连接与验证
# 连接本地 MongoDB(默认端口 27017)
mongosh
连接成功输出:
Current Mongosh Log ID: 680a1533277aa1c07b1b26ff
Connecting to: mongodb://127.0.0.1:27017/directConnection=true...
Using MongoDB: 8.0.8
Using Mongosh: 2.5.0
test>
警告说明:
-
XFS filesystem recommended
:建议使用 XFS 文件系统以优化 WiredTiger 存储引擎 -
Access control is not enabled
:生产环境需启用访问控制 -
bound to localhost
:默认仅本地访问,如需远程连接需配置 --bind_ip
四、数据库基本操作
4.1 查看与切换数据库
// 查看所有数据库
show dbs
// 查看当前使用的数据库
db
// 切换/创建数据库(插入数据后才会实际创建)
use runoob
4.2 创建数据库实例
// 创建并切换到 runoob 数据库
use runoob
// 插入数据使数据库生效
db.runoob.insertOne({name: "zhangsan"})
// 再次查看数据库列表
show dbs
输出结果:
admin 40.00 KiB
config 60.00 KiB
local 40.00 KiB
runoob 40.00 KiB
4.3 删除数据库
// 切换到要删除的数据库
use runoob
// 删除当前数据库
db.dropDatabase()
// 验证删除结果
show dbs
4.4 系统内置数据库
- admin:存储用户认证信息和全局权限,认证后可执行跨库操作
- config:分片集群中存储分片元数据(块分布、分片策略)
- local:存储当前节点的副本集状态和操作日志(oplog),不复制到其他节点
五、集合(Collection)管理
5.1 查看与创建集合
// 查看当前库的集合
show collections
// 创建普通集合(插入数据后才会实际创建)
db.createCollection("myCollection")
5.2 创建复杂配置集合
// 创建固定大小、带验证的集合
db.createCollection("myComplexCollection", {
capped: true, // 固定大小集合
size: 10485760, // 最大 10MB
max: 5000, // 最多 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 } // 排序规则
})
5.3 重命名集合
// 同数据库重命名
db.adminCommand({
renameCollection: "test.oldCollection",
to: "test.newCollection"
})
// 跨数据库重命名
db.adminCommand({
renameCollection: "test.oldCollection",
to: "production.newCollection"
})
参数说明:dropTarget
可选参数,若目标集合存在则删除(默认 false)。
5.4 删除集合
// 删除 mydb 库中的 kgc 集合
use mydb
db.kgc.drop()
// 验证删除结果
show collections
六、文档(Document)CRUD 操作
6.1 插入文档
6.1.1 插入单个文档
// 插入单个文档
db.myCollection.insertOne({
name: "Alice",
age: 25,
city: "New York",
hobbies: ["reading", "music"]
})
返回结果:
{
acknowledged: true,
insertedId: ObjectId("60c72b2f9b1d8b5a5f8e2b2d")
}
6.1.2 插入多个文档
// 插入多个文档
db.myCollection.insertMany([
{ name: "Bob", age: 30, city: "Los Angeles", status: "active" },
{ name: "Charlie", age: 35, city: "Chicago", status: "active" }
])
6.2 查询文档
6.2.1 基础查询
// 查询所有文档
db.myCollection.find()
// 按条件查询(age > 25)
db.myCollection.find({ age: { $gt: 25 } })
// 带投影查询(只返回 name 和 age,排除 _id)
db.myCollection.find(
{ age: { $gt: 25 } },
{ name: 1, age: 1, _id: 0 }
)
// 格式化输出
db.myCollection.find().pretty()
6.2.2 单个文档查询
// 查询单个文档
db.myCollection.findOne({ name: "Alice" })
// 带投影的单个文档查询
db.myCollection.findOne(
{ name: "Alice" },
{ name: 1, age: 1, _id: 0 }
)
6.3 删除文档
6.3.1 删除单个文档
// 删除 name 为 Alice 的文档
db.myCollection.deleteOne({ name: "Alice" })
返回结果:
{ acknowledged: true, deletedCount: 1 }
6.3.2 删除多个文档
// 删除所有 name 为 Bob 的文档
db.myCollection.deleteMany({ name: "Bob" })
6.3.3 查找并删除
// 查找并删除,返回删除的文档
db.myCollection.findOneAndDelete(
{ name: "Charlie" },
{ projection: { name: 1, age: 1 } }
)
6.4 更新文档
6.4.1 更新单个文档
// 将 Alice 的年龄更新为 26
db.myCollection.updateOne(
{ name: "Alice" },
{ $set: { age: 26 } },
{ upsert: false } // 不存在不插入
)
6.4.2 更新多个文档
// 将年龄小于 30 的用户状态设为 active
db.myCollection.updateMany(
{ age: { $lt: 30 } },
{ $set: { status: "active" } }
)
6.4.3 替换文档
// 完全替换 Bob 的文档
db.myCollection.replaceOne(
{ name: "Bob" },
{ name: "Bob", age: 31, city: "San Francisco" }
)
6.4.4 查找并更新
// 查找并更新,返回更新后的文档
db.myCollection.findOneAndUpdate(
{ name: "Charlie" },
{ $set: { age: 36 } },
{ returnDocument: "after" }
)
七、数据备份与恢复
7.1 安装备份工具
# 安装 MongoDB 数据库工具
rpm -ivh mongodb-database-tools-rhel70-x86_64-100.12.0.rpm
7.2 数据备份(mongodump)
# 备份所有数据库到当前目录的 dump 文件夹
mongodump
# 备份指定数据库(如 test)
mongodump -d test -o /data/backup/test
# 备份指定集合
mongodump -d test -c myCollection -o /data/backup/collection
# 备份远程数据库
mongodump -h 192.168.1.100:27017 -u username -p password -d mydb
备份输出示例:
2025-04-25T22:44:21.307+0800 writing admin.system.version to dump/admin/system.version.bson
2025-04-25T22:44:21.313+0800 done dumping test.myCollection (3 documents)
7.3 数据恢复(mongorestore)
# 从默认 dump 目录恢复所有数据
mongorestore
# 恢复到指定数据库(如 test2)
mongorestore -d test2 /data/backup/test
# 恢复时先删除现有数据(慎用)
mongorestore --drop -d test /data/backup/test
# 恢复远程数据库
mongorestore -h 192.168.1.100:27017 -u username -p password -d mydb /data/backup/mydb
恢复输出示例:
2025-04-25T22:50:28.125+0800 restoring test.myCollection from dump/test/myCollection.bson
2025-04-25T22:50:28.151+0800 6 document(s) restored successfully.
八、用户管理与权限控制
8.1 创建用户与分配角色
// 切换到目标数据库(如 testdb)
use testdb
// 创建用户并分配角色
db.createUser({
user: "testuser",
pwd: "password123",
roles: [
{ role: "readWrite", db: "testdb" }, // 读写权限
{ role: "dbAdmin", db: "testdb" } // 数据库管理权限
]
})
8.2 用户认证
// 验证用户身份
db.auth("testuser", "password123")
// 返回 1 表示认证成功
8.3 启用访问控制
8.3.1 配置文件启用
修改 mongod.conf
添加:
security:
authorization: "enabled"
8.3.2 命令行启用
mongod --auth --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
8.4 带认证登录
mongosh --host localhost --port 27017 -u "testuser" -p "password123" --authenticationDatabase "testdb"
8.5 删除用户
// 删除 testuser 用户
db.dropUser("testuser")
九、总结
在实际应用中,还需注意以下最佳实践:
- 数据模型设计:利用 MongoDB 的文档嵌套特性,减少关联查询,遵循 "One Document, One Entity" 原则
- 索引优化:为高频查询字段创建索引,避免全表扫描,定期分析查询计划(
explain()
) - 分片策略:大数据量场景提前规划分片键,确保数据均匀分布
- 备份策略:定期增量备份,异地存储备份文件,测试恢复流程
- 安全配置:生产环境必须启用认证,限制网络访问,使用专用管理账户
- 监控告警:关注数据库连接数、内存使用、磁盘IO等指标,设置告警阈值
MongoDB 的灵活性和扩展性为现代应用开发提供了强大支持,随着业务发展,合理运用其高级特性(如聚合框架、地理空间查询、事务支持)将进一步释放其潜力。