本文基于 MongoDB 官方实践与文档规范整理,覆盖核心概念、安装部署、Shell 操作、数据管理、备份恢复、用户权限全流程,包含所有实操命令并补充扩展知识点,可直接用于学习与生产环境部署。
一、基础概念
1. 什么是 MongoDB?
MongoDB 是一个开源、跨平台、面向文档的 NoSQL 数据库,用 C++ 编写,是目前全球最流行的 NoSQL 数据库。
它不使用传统数据库的表 / 行 结构,而是使用集合 (Collection) + 文档 (Document) 存储数据。
2. 是什么类型的数据库?
- 非关系型数据库(NoSQL)
- 文档型数据库(Document Database)
- 分布式、可水平扩展的数据库
3. 核心作用
- 存储半结构化 / 非结构化数据(JSON/BSON 格式)
- 支持高并发、大数据量的读写
- 支持灵活的表结构,随时增删字段
- 支持分布式集群、高可用
- 快速开发,无需严格预定义表结构
4. 核心优势
- 无 Schema 约束,字段可动态增减
- 内置分片与副本集,支持海量数据扩展
- 查询语法贴近 JSON,易上手
- 支持事务、索引、聚合、大文件存储(GridFS)
二、MongoDB 数据结构(和关系型数据库对比)
表格
| 关系型数据库(MySQL/Oracle) | MongoDB |
|---|---|
| 数据库(Database) | 数据库(Database) |
| 表(Table) | 集合(Collection) |
| 行(Row) | 文档(Document) |
| 列(Column) | 字段(Field) |
| 主键(Primary Key) | 自动生成 _id |
| 外键关联 | 内嵌文档 / 引用 |
MongoDB 与传统数据库(如 MySQL)的区别
1. 数据模型不同
- MySQL:结构化数据,必须先建表、定义字段类型,结构固定
- MongoDB:文档模型,结构灵活,每个文档字段可不一样,无需预定义
2. 查询语言不同
- MySQL:SQL 语句
- MongoDB:基于 JSON 的查询语法
3. 扩展性不同
- MySQL:主要垂直扩展(升级服务器配置)
- MongoDB:天然水平扩展(加机器分片)
4. 事务支持
- MySQL:强事务,支持复杂事务
- MongoDB:4.0+ 支持多文档事务,满足大多数业务需求
5. 适用数据
- MySQL:结构化、强关联、强一致性数据
- MongoDB:半结构化、非结构化、多变结构数据
四、MongoDB 适合的场景(高频面试点)
✅ 最适合
- 大数据量、高并发(电商、社交、日志)
- 数据结构经常变化(需求频繁改动的项目)
- 物联网、设备数据(传感器、日志)
- 内容管理、博客、新闻、评论系统
- 实时分析、缓存层
- 移动端 / 后端快速开发
- 分布式应用
❌ 不适合
- 强事务、金融核心交易(虽然支持事务但不如 MySQL 成熟)
- 大量复杂多表关联查询
- 传统 ERP、银行核心系统
五、MongoDB 核心特点(扩展知识点)
1. 数据格式:BSON
- 二进制 JSON,比 JSON 更快、更小、支持更多类型(日期、二进制、ObjectId)
2. 自动生成主键 _id
- 无需手动设置主键,MongoDB 自动生成唯一 ID
3. 索引支持
- 支持单字段索引、复合索引、文本索引、地理空间索引
- 优化查询速度
4. 强大的查询能力
- 支持条件、范围、排序、分页、聚合、分组、连接查询
- 功能接近关系型数据库
5. 分布式架构
- 分片(Sharding):水平拆分数据,存储海量数据
- 副本集(Replica Set):主从复制,高可用,自动故障转移
6. schema 灵活(无固定结构)
- 同一个集合里的文档可以有完全不同的字段
- 开发效率极高
7. 支持多种语言驱动
- Java、Python、Node.js、Go、PHP 等几乎所有语言都支持
六、MongoDB 优缺点总结
优点
- 结构灵活,适合快速迭代开发
- 读写性能高
- 水平扩展轻松,支持海量数据
- 文档模型天然适配程序对象(JSON)
- 运维简单,集群易用
缺点
- 占用存储空间比 MySQL 大
- 事务功能不如关系型数据库成熟
- 复杂关联查询效率一般
- 不适合超复杂的 SQL 统计查询
八、MongoDB 典型应用公司
- 腾讯、阿里、百度、京东
- 字节跳动、美团、小米
- Twitter、Facebook、Google
- 游戏、直播、电商、物联网平台大量使用
总结(最核心必背)
- MongoDB = 文档型 NoSQL 数据库
- 结构:库 → 集合 → 文档(JSON/BSON)
- 最大优势:灵活、高性能、易扩展
- 适合:数据量大、结构多变、高并发场景
- 与 MySQL 区别:schema 灵活、分布式友好、无强表结构
- 核心组件:副本集(高可用)、分片(水平扩展)、索引(查询快)
二、Linux 环境安装部署
1. 依赖安装
bash
运行
# 安装基础依赖
dnf install libcurl openssl gcc make perl -y
2. 安装 OpenSSL 1.1.1
bash
运行
# 解压源码包
tar -zxvf 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
3. 安装 MongoDB 服务端
bash
运行
# 解压安装包
tar -zxvf mongodb-linux-x86_64-rhel8-8.0.8.tgz
# 移动到指定目录
mv mongodb-linux-x86_64-rhel8-8.0.8 /usr/local/mongodb
# 配置PATH环境变量
echo 'export PATH=/usr/local/mongodb/bin:$PATH' >> /etc/profile
source /etc/profile
4. 创建数据与日志目录
bash
运行
# 创建目录
mkdir -p /var/lib/mongo
mkdir -p /var/log/mongodb
# 授权
chown `whoami` /var/lib/mongo
chown `whoami` /var/log/mongodb
5. 启动 MongoDB
bash
运行
mongod --dbpath /var/lib/mongo \
--logpath /var/log/mongodb/mongod.log \
--bind_ip_all \
--fork
补充知识点:
--bind_ip_all:允许所有 IP 访问,生产环境建议指定具体 IP--fork:后台守护进程运行- 默认端口:27017
三、MongoDB Shell(mongosh)安装与使用
1. 安装 Shell 工具
bash
运行
tar -zxvf 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/
2. 连接 MongoDB
bash
运行
# 本地默认连接
mongosh
# 远程连接
mongosh --host 127.0.0.1 --port 27017
四、数据库管理操作
1. 查看数据库
bash
运行
# 查看所有数据库
show dbs
# 查看当前数据库
db
2. 创建 / 切换数据库
bash
运行
# 不存在则创建,存在则切换
use mydb
补充知识点:
- 数据库仅插入数据后才会被持久化显示
3. 删除数据库
bash
运行
use mydb
db.dropDatabase()
4. 系统内置库说明
admin:全局权限、用户管理config:分片集群元数据local:本地副本集日志,不参与同步
五、集合(Collection)管理
1. 查看集合
bash
运行
show collections
# 或
show tables
2. 创建集合
bash
运行
# 基础创建
db.createCollection("user")
# 高级创建(固定大小+数据验证)
db.createCollection("user_info", {
capped: true,
size: 10485760,
max: 5000,
validator: {
$jsonSchema: {
bsonType: "object",
required: ["name", "phone"],
properties: {
name: { bsonType: "string" },
phone: { bsonType: "string" }
}
}
},
validationLevel: "strict"
})
补充知识点:
capped:true:固定容量集合,满后自动覆盖旧数据validator:文档数据校验,保证数据规范
3. 重命名集合
bash
运行
db.adminCommand({
renameCollection: "mydb.old_col",
to: "mydb.new_col",
dropTarget: false
})
4. 删除集合
bash
运行
db.user.drop()
六、文档(Document)CRUD 操作
1. 插入文档
bash
运行
# 单条插入
db.user.insertOne({
name: "张三",
age: 22,
city: "郑州"
})
# 批量插入
db.user.insertMany([
{ name: "李四", age: 25, city: "北京" },
{ name: "王五", age: 30, city: "上海" }
])
补充知识点:
- 无集合时自动创建集合
_id:自动生成唯一主键
2. 查询文档
bash
运行
# 查询所有
db.user.find()
# 格式化显示
db.user.find().pretty()
# 条件查询(年龄>25)
db.user.find({ age: { $gt: 25 } })
# 指定字段返回(排除_id)
db.user.find(
{ age: { $gt: 25 } },
{ name: 1, age: 1, _id: 0 }
)
# 查询单条
db.user.findOne({ name: "张三" })
常用查询操作符:
$gt:大于$lt:小于$gte:大于等于$lte:小于等于$ne:不等于
3. 更新文档
bash
运行
# 更新单条
db.user.updateOne(
{ name: "张三" },
{ $set: { age: 23 } }
)
# 更新多条
db.user.updateMany(
{ age: { $lt: 30 } },
{ $set: { status: "active" } }
)
# 替换文档
db.user.replaceOne(
{ name: "李四" },
{ name: "李四", age: 26, city: "深圳" }
)
# 查找并返回更新后文档
db.user.findOneAndUpdate(
{ name: "王五" },
{ $set: { age: 31 } },
{ returnDocument: "after" }
)
补充知识点:
$set:只更新指定字段,不覆盖整个文档upsert:true:无匹配数据则自动插入
4. 删除文档
bash
运行
# 删除单条
db.user.deleteOne({ name: "张三" })
# 删除多条
db.user.deleteMany({ age: { $gt: 30 } })
# 查找并删除
db.user.findOneAndDelete({ name: "李四" })
七、备份与恢复(mongodump/mongorestore)
1. 安装工具
bash
运行
rpm -ivh mongodb-database-tools-rhel70-x86_64-100.12.0.rpm
2. 数据备份
bash
运行
# 全量备份
mongodump -h 127.0.0.1:27017 -o /data/backup/
# 单库备份
mongodump -d mydb -o /data/backup/
# 单集合备份
mongodump -d mydb -c user -o /data/backup/
3. 数据恢复
bash
运行
# 全量恢复
mongorestore /data/backup/
# 单库恢复
mongorestore -d mydb /data/backup/mydb
# 恢复前清空数据(慎用)
mongorestore -d mydb --drop /data/backup/mydb
八、用户与权限管理
1. 创建用户
bash
运行
use mydb
db.createUser({
user: "db_admin",
pwd: "Admin@123",
roles: [
{ role: "readWrite", db: "mydb" },
{ role: "dbAdmin", db: "mydb" }
]
})
2. 用户认证
bash
运行
db.auth("db_admin", "Admin@123")
3. 启用身份验证
bash
运行
# 启动时添加认证参数
mongod --auth --dbpath /var/lib/mongo \
--logpath /var/log/mongodb/mongod.log \
--bind_ip_all --fork
4. 认证连接
bash
运行
mongosh -u "db_admin" -p "Admin@123" \
--authenticationDatabase "mydb"
5. 删除用户
bash
运行
db.dropUser("db_admin")
常用角色:
read:只读readWrite:读写dbAdmin:库管理root:超级管理员
九、补充核心知识点
- ObjectId:12 字节唯一标识,包含时间戳、机器 ID、进程 ID、计数器
- 索引:支持单字段、复合、多键、地理空间索引,提升查询速度
- 副本集:一主多从,自动故障转移,保证高可用
- 分片:水平拆分数据,分散存储到多个节点,支撑亿级数据
- 事务:4.0 + 支持多文档事务,保证 ACID 特性
- GridFS:存储 > 16MB 大文件(图片、视频)
- 聚合框架 :
$match、$group、$sort等,实现复杂数据分析
十、生产环境最佳实践
- 启用身份验证,禁止裸奔运行
- 使用 XFS 文件系统,搭配 WiredTiger 存储引擎
- 合理创建索引,避免全表扫描
- 定期备份数据,防止丢失
- 副本集 + 分片架构保证高可用与扩展性