markdown
MongoDB 核心概念全解析
从 SQL 思维 → MongoDB 思维(2025 年最新版)
MongoDB 是 文档型 NoSQL 数据库,其设计哲学是:“数据结构像代码一样灵活”。
以下将 SQL 概念 ↔ MongoDB 概念 一一对应解析,带你从 0 建立完整认知。
一、核心概念对照表(SQL vs MongoDB)
| SQL 概念 | MongoDB 概念 | 说明 | 类比 |
|---|---|---|---|
| Database | Database | 数据库 | 一样 |
| Table | Collection | 集合 | 一张“表”,但无固定列 |
| Row | Document | 文档 | 一行数据,用 BSON/JSON 表示 |
| Column | Field | 字段 | 键值对,支持嵌套 |
| Primary Key | _id | 主键 | 自动生成 ObjectId,唯一 |
| Index | Index | 索引 | 提升查询性能 |
| JOIN | $lookup / 嵌套 | 关联查询 | 优先用嵌套,次选 $lookup |
| Schema | Dynamic Schema | 动态结构 | 无固定 Schema |
// MongoDB 文档示例(相当于 SQL 一行)
{
"_id": ObjectId("671f2a1b9d8e4c2a7f1b3d5e"),
"name": "张三",
"age": 28,
"address": {
"city": "北京",
"zip": "100000"
},
"hobbies": ["阅读", "编程"],
"isActive": true
}
二、核心概念深度解析
1. Database(数据库)
- 逻辑容器,隔离不同项目数据。
- 一个 MongoDB 实例可包含多个数据库。
- 默认数据库:
admin、local、config。
use company // 切换到 company 数据库(不存在则自动创建)
show dbs // 列出所有数据库
2. Collection(集合)
- 相当于 SQL 的“表”,但 无 Schema 约束。
- 同一个集合中,文档可以结构完全不同。
- 命名规则:
- 不能为空
- 不能包含
\0(空字符) - 不能以
system.开头(系统保留) - 建议使用小写 + 下划线(如
user_profiles)
show collections
db.createCollection("logs") // 可选,insert 会自动创建
3. Document(文档)
- 核心存储单元,BSON 格式(Binary JSON)。
- 最大大小:16 MB(适合大多数业务)。
- 支持 嵌套文档 和 数组,天然表达复杂关系。
// 嵌套文档
{
"user": {
"profile": { "name": "李四", "age": 25 },
"settings": { "theme": "dark" }
}
}
// 数组
{
"tags": ["mongodb", "nosql", "database"],
"scores": [98, 87, 92]
}
4. _id(主键)
- 每个文档 必须有
_id字段。 - 默认自动生成
ObjectId(12 字节): - 4 字节时间戳 + 5 字节随机值 + 3 字节计数器
- 天然递增,全局唯一
- 可自定义,但必须唯一。
// 自动生成
db.users.insertOne({ name: "王五" })
// 自定义 _id
db.users.insertOne({ _id: "U001", name: "赵六" })
5. BSON(Binary JSON)
- MongoDB 内部存储格式,比 JSON 更高效。
- 支持类型:
null,boolean,number,string,array,object,ObjectId,Date,Binary,Regex等。 - 优势:
- 支持二进制数据(图片、文件)
- 遍历更快
- 支持更多数据类型
// BSON 类型示例
{
"_id": ObjectId("..."),
"birthday": ISODate("1995-03-15T00:00:00Z"),
"active": true,
"score": 95.5,
"binary": BinData(0, "base64string...")
}
6. Schema 设计哲学
| SQL 思维 | MongoDB 思维 |
|---|---|
| 规范化(范式) | 反规范化(嵌套) |
| 多表 JOIN | 单文档嵌套 或 $lookup |
| 固定列 | 动态字段 |
// 推荐:嵌套(读多写少)
{
"order_id": "O001",
"customer": {
"name": "张三",
"phone": "138..."
},
"items": [
{ "name": "手机", "price": 5999 },
{ "name": "耳机", "price": 999 }
]
}
// 不推荐:多集合 JOIN(除非数据量大)
orders → customers → order_items
三、进阶概念
1. Capped Collection(固定集合)
- 大小固定,先进先出(FIFO),类似日志。
- 高性能写入,适合日志、缓存。
db.createCollection("logs", { capped: true, size: 1048576, max: 1000 })
2. GridFS(大文件存储)
- 存储 > 16MB 的文件(如视频、图片)。
- 自动分片为
fs.files(元数据) +fs.chunks(数据块)。
// 使用 mongofiles 工具
mongofiles put video.mp4
3. Change Streams(变更流)
- 实时监听集合变更(插入、更新、删除)。
- 类似 MySQL Binlog,用于同步、审计。
const changeStream = db.collection.watch();
for await (const change of changeStream) {
printjson(change);
}
4. Time Series Collections(时序集合)
- 专为 IoT、监控、日志优化。
- 自动分区,按时间排序,压缩率高。
db.createCollection("sensor_data", {
timeseries: {
timeField: "timestamp",
metaField: "metadata",
granularity: "minutes"
}
})
5. Vector Search(向量搜索,7.0+)
- 支持 AI 向量相似性搜索(embedding)。
- 用于推荐、语义搜索。
db.vectors.createIndex({ embedding: "vectorSearch" })
四、MongoDB 架构概念
| 概念 | 说明 |
|---|---|
| Instance | 一个 mongod 进程 |
| Replica Set | 主从复制集群(高可用) |
| Sharding | 分片集群(水平扩展) |
| Config Server | 分片元数据存储 |
| Mongos | 分片路由器 |
| Atlas | MongoDB 云服务(全托管) |
单节点 → Replica Set → Sharded Cluster → Atlas
五、查询与操作概念
| 操作 | 命令 |
|---|---|
| 插入 | insertOne, insertMany |
| 查询 | find, findOne |
| 更新 | updateOne, updateMany, replaceOne |
| 删除 | deleteOne, deleteMany |
| 聚合 | aggregate(管道:$match, $group, $lookup, $unwind) |
| 索引 | createIndex, dropIndex |
// 聚合管道示例:统计各城市用户数
db.users.aggregate([
{ $group: { _id: "$city", count: { $sum: 1 } } },
{ $sort: { count: -1 } }
])
六、索引类型
| 类型 | 用途 |
|---|---|
| 单字段索引 | { age: 1 } |
| 复合索引 | { age: 1, name: -1 } |
| 文本索引 | { content: "text" } |
| 地理索引 | { location: "2dsphere" } |
| TTL 索引 | { createdAt: 1 } + expireAfterSeconds: 3600 |
| 部分索引 | partialFilterExpression |
| 稀疏索引 | sparse: true |
七、事务(4.0+)
- 支持 多文档 ACID 事务(副本集 + 分片)。
- 适用场景:转账、订单支付。
const session = db.getMongo().startSession()
session.startTransaction()
try {
db.accounts.updateOne({id:1}, {$inc:{balance:-100}}, {session})
db.accounts.updateOne({id:2}, {$inc:{balance:100}}, {session})
session.commitTransaction()
} catch (e) {
session.abortTransaction()
}
八、总结:MongoDB 概念思维导图
MongoDB
├── Database
│ └── Collection
│ └── Document (BSON)
│ ├── _id (ObjectId)
│ ├── Field (嵌套/数组)
│ └── Dynamic Schema
├── 架构
│ ├── Replica Set (高可用)
│ └── Sharding (高扩展)
├── 查询
│ ├── CRUD
│ ├── Aggregation Pipeline
│ └── Index
└── 高级
├── GridFS
├── Change Streams
├── Time Series
└── Vector Search
九、一句话总结
MongoDB = “用 JSON 存数据,像操作对象一样操作数据库”
推荐学习路径:
- 掌握
mongosh→ 2. 设计嵌套文档 → 3. 学会聚合管道 → 4. 搭建副本集
如需 Schema 设计最佳实践、性能调优索引策略、从 MySQL 迁移到 MongoDB,欢迎继续提问!