前言
MongoDB 是目前最流行的文档型 NoSQL 数据库,以高性能、高可用、易扩展、动态 Schema 著称,广泛用于互联网后端、大数据、日志存储、物联网等场景。本文基于官方标准与生产实践,从零开始讲解 MongoDB 核心概念、Linux 安装、Shell 使用、库 / 集合 / 文档操作、用户权限、备份恢复,并提供高频错误解决方案,适合新手入门与运维参考。
一、MongoDB 基础概念
1.1 什么是 MongoDB
MongoDB 是一个面向文档的分布式数据库,数据以 **BSON(二进制 JSON)** 存储,结构灵活,无需预先定义表结构,支持嵌套文档与数组,非常适合快速迭代的业务系统。
1.2 核心优势
- 文档存储:类 JSON 格式,易读易维护
- 动态模式:无需固定表结构
- 水平扩展:支持分片集群
- 高可用:副本集自动容灾
- 丰富索引:提升查询效率
- 强大查询:支持条件、投影、排序、分页、聚合
- 大文件存储:GridFS 支持超 16MB 文件
- 多语言驱动:Java/Python/Go/Node.js/PHP 等
1.3 MongoDB 与 SQL 概念对照(表格版)
表格
| SQL 术语 | MongoDB 术语 | 说明 |
|---|---|---|
| 数据库(Database) | 数据库(Database) | 数据存储容器 |
| 表(Table) | 集合(Collection) | 一组文档 |
| 行(Row) | 文档(Document) | 单条数据 |
| 列(Column) | 字段(Field) | 键值对 |
| 主键(Primary Key) | _id |
自动生成唯一 ID |
| 索引(Index) | 索引(Index) | 加速查询 |
| 表连接(JOIN) | $lookup |
聚合关联 |
| 视图(View) | 视图(View) | 只读逻辑集合 |
1.4 核心专业术语
表格
| 术语 | 含义 |
|---|---|
| BSON | 二进制 JSON,MongoDB 存储格式 |
| ObjectId | 文档默认主键 |
| 副本集 Replica Set | 高可用集群 |
| 分片 Sharding | 水平扩展 |
| 聚合 Aggregation | 数据统计分析 |
| TTL 索引 | 自动过期删除 |
| GridFS | 大文件存储 |
| CRUD | 增删改查 |
二、MongoDB Linux 安装(CentOS / RHEL)
2.1 安装依赖
dnf install libcurl openssl gcc make perl -y
2.2 解压安装
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 配置环境变量
echo 'export PATH=/usr/local/mongodb/bin:$PATH' >> /etc/profile
source /etc/profile
2.4 创建数据与日志目录
mkdir -p /var/lib/mongo
mkdir -p /var/log/mongodb
chown -R mongod:mongod /var/lib/mongo
chown -R mongod:mongod /var/log/mongodb
2.5 安装 OpenSSL 1.1.1(部分版本必需)
tar xzf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
./config --prefix=/opt/openssl11 --openssldir=/opt/openssl11/ssl
make -j$(nproc)
make install
echo 'export LD_LIBRARY_PATH=/opt/openssl11/lib:$LD_LIBRARY_PATH' > /etc/profile.d/openssl11.sh
source /etc/profile.d/openssl11.sh
2.6 启动 MongoDB
前台启动(调试)
mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log
后台守护启动(生产)
mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
启动成功提示:
plaintext
about to fork child process, waiting until server is ready for connections.
forked process: 12102
child process started successfully, parent exiting
三、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
本地连接
mongosh
远程连接
mongosh --host 192.168.1.10 --port 27017
四、数据库管理
4.1 查看数据库
show dbs
4.2 查看当前数据库
db
4.3 创建 / 切换数据库
MongoDB 使用 use 自动创建数据库
use mydb
4.4 删除数据库
db.dropDatabase()
4.5 系统内置数据库
表格
| 库名 | 作用 |
|---|---|
| admin | 权限管理、超级用户 |
| config | 分片集群元数据 |
| local | 本地数据,不复制 |
五、集合(Collection)管理
5.1 查看集合
show collections
show tables
5.2 创建普通集合
db.createCollection("mycol")
5.3 创建带 JSON Schema 校验的集合(生产常用)
db.createCollection("mycol", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["name", "email"],
properties: {
name: { bsonType: "string" },
email: { bsonType: "string", pattern: "^.+@.+$" }
}
}
},
validationLevel: "strict",
validationAction: "error"
})
5.4 集合创建参数(表格)
表格
| 参数 | 类型 | 说明 |
|---|---|---|
| capped | bool | 是否固定大小集合 |
| size | number | 集合最大字节 |
| max | number | 最大文档数 |
| validator | object | 文档校验规则 |
| validationLevel | string | 校验严格程度 |
| validationAction | string | 校验失败处理 |
| storageEngine | object | 存储引擎配置 |
5.5 重命名集合
db.adminCommand({
renameCollection: "test.mycol",
to: "test.mycol_new",
dropTarget: false
})
5.6 删除集合
db.mycol.drop()
六、文档 CRUD 操作(核心)
6.1 插入文档
插入单条
db.mycol.insertOne({
name: "zhangsan",
age: 20,
city: "zhengzhou",
email: "1011@qq.com"
})
插入多条
db.mycol.insertMany([
{name:"zhangsan",age:20,city:"zhengzhou",email:"1011@qq.com"},
{name:"wangwu",age:26,city:"shanghai",email:"1012@qq.com"}
])
6.2 查询文档
查询所有
db.mycol.find()
格式化显示
db.mycol.find().pretty()
条件查询
db.mycol.find({ age: { $gt: 20 } })
查询单条
db.mycol.findOne({ name: "zhangsan" })
投影(指定返回字段)
db.mycol.find({},{name:1,age:1,_id:0})
6.3 更新文档
更新单条
db.mycol.updateOne(
{ name: "zhangsan" },
{ $set: { age: 21 } }
)
更新多条
db.mycol.updateMany(
{ age: { $lt: 30 } },
{ $set: { status: "young" } }
)
替换整个文档
db.mycol.replaceOne(
{ name: "lisi" },
{ name: "lisi02", age: 30, city: "zhongguo", email: "1014@qq.com" }
)
6.4 删除文档
删除单条
db.mycol.deleteOne({ name: "zhangsan" })
删除多条
db.mycol.deleteMany({ age: { $gt: 30 } })
七、MongoDB 常用操作符(表格速查)
7.1 比较操作符
表格
| 操作符 | 含义 |
|---|---|
| $eq | 等于 |
| $ne | 不等于 |
| $gt | 大于 |
| $gte | 大于等于 |
| $lt | 小于 |
| $lte | 小于等于 |
| $in | 在数组中 |
| $nin | 不在数组中 |
7.2 逻辑操作符
$and$or$not$nor
7.3 更新操作符
表格
| 操作符 | 作用 |
|---|---|
| $set | 更新字段 |
| $unset | 删除字段 |
| $inc | 数字自增 / 自减 |
| $push | 向数组添加元素 |
| $pull | 从数组删除元素 |
八、用户与权限管理
8.1 创建用户
use testdb
db.createUser({
user: "testuser",
pwd: "password123",
roles: [
{ role: "readWrite", db: "testdb" },
{ role: "dbAdmin", db: "testdb" }
]
})
8.2 常用角色(表格)
表格
| 角色 | 权限 |
|---|---|
| read | 只读 |
| readWrite | 读写 |
| dbAdmin | 库管理 |
| userAdmin | 用户管理 |
| clusterAdmin | 集群管理 |
| root | 超级管理员 |
8.3 带认证启动 MongoDB
mongod --auth --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
8.4 认证登录
mongosh -u "testuser" -p "password123" --authenticationDatabase "testdb"
8.5 删除用户
db.dropUser("testuser")
九、备份与恢复
9.1 安装工具
rpm -ivh mongodb-database-tools-rhel70-x86_64-100.12.0.rpm
9.2 备份(mongodump)
备份所有库
mongodump
备份指定库
mongodump -d testdb -o /backup
9.3 恢复(mongorestore)
恢复所有库
mongorestore
恢复指定库
mongorestore -d testdb /backup/testdb
十、高频错误与解决方案(必看)
10.1 Document failed validation
原因 :缺少 Schema 校验的必填字段(如 name、email)解决 :插入时补全所有 required 字段
10.2 insertOne 传入数组报错
原因 :insertOne 只能插入单个对象解决 :批量插入用 insertMany
10.3 replaceOne 括号错误(你遇到的问题)
错误写法:
db.mycol.replaceOne({name:"lisi"}),{...};
正确写法:
db.mycol.replaceOne({name:"lisi"}, {...});
10.4 MongoDB 启动失败 exited with 1
原因 :数据 / 日志目录权限不属于 mongod解决:
chown -R mongod:mongod /var/lib/mongo
chown -R mongod:mongod /var/log/mongodb
十一、总结
本文完整覆盖 MongoDB 从安装到生产实战全流程:
- 基础概念与 SQL 对照
- Linux 环境手动编译安装
- mongosh 使用
- 库 / 集合管理
- CRUD 全套操作
- 用户权限与安全认证
- 备份恢复
- 高频错误解决方案
MongoDB 凭借灵活的文档结构、强大的扩展性和易用性,已成为现代 Web 应用首选数据库之一。掌握本文内容,可直接胜任日常开发、测试、运维工作