MongoDB 教程 · 关系型工程师视角
MongoDB:把文档数据库还原成一条主线
基于 MongoDB 8.0(2024-10 GA),覆盖文档模型、查询与聚合、索引与建模、WiredTiger 存储引擎、副本集与一致性、分片与选型。代码示例为 mongosh 语法,未在本机连真实实例验证——视为可读的伪运行,而非测试通过的脚本。
▸适合谁
这份教程为已经熟悉关系型数据库的后端工程师写。它默认你能做到以下三件事——如果不能,先补这一项再回来:
前置能力(具体到动作)
- 能在 PostgreSQL 或 MySQL 里写多表 JOIN,并读懂
EXPLAIN输出里的 seq scan / index scan / nested loop。 - 能说清 B-tree 索引为什么能把范围查询从 O(n) 降到 O(log n),以及为什么写入要付索引维护的代价。
- 理解 WAL / redo log 和 MVCC 的基本作用:为什么"提交成功"要先落日志,为什么读不阻塞写。
▸不适合谁
两类读者请换一份资源,会更高效:
- 没碰过数据库的初学者——本教程不解释"什么是索引""什么是事务",而是直接对比 MongoDB 与关系型在这些点上的差异。先到 MongoDB University 的免费入门课建立基线。
- 要深挖 WiredTiger 源码或分布式协议形式化证明的人——本教程讲到"比官方文档深一层"的机制为止;再往下请读 repl/README、WiredTiger 架构文档 与 Jepsen 分析。
▸读完之后你能做到什么
核心收获,一句话:在"该用 MongoDB 还是关系型"这个决策上,你不再按"数据长得像不像表"来判断,而是按"访问模式是否稳定、是否以单个文档为读写单位"来判断;并能把文档模型、$lookup 的代价、读写关注、shard key 选择,全部还原到同一条主线上。这是官方文档不会替你串起来的那条线。
具体地,读完你能:
- 给一个真实需求,决定字段该嵌入还是引用,并说出判据(访问是否同时发生、是否无界增长、是否独立写入)。
- 读一条慢聚合,判断瓶颈是缺索引、
$lookup嵌套循环、还是$sort溢出,而不是笼统地说"性能问题"。 - 给定写入模式,选出不会造成热分片的 shard key,并解释为什么单调递增键会把负载压到一个分片。
- 配置
writeConcern与readConcern,说清一次写入在什么条件下会丢、在什么条件下读到的是旧值。 - 在选型评审里,诚实地说出 MongoDB 不该用在哪(重多实体事务、复杂即席 JOIN、强关系约束)。
一句话本质
- 在 MongoDB 里,schema 是"访问模式"的函数,不是数据逻辑结构的函数——一起被读取的数据就该存在一起。
关系型从数据的逻辑结构出发,靠范式化消除冗余,靠 JOIN 在查询时重新拼装。MongoDB 反过来:从查询怎么读出发,把一起读的数据预先拼好存进一个文档。理解了这一条,后面的一切——为什么推荐反范式、为什么 $lookup 被劝退、为什么 16MB 上限在约束你的设计——都不再是孤立的规则。
稳定可放心学:文档模型、WiredTiger 存储引擎、副本集、分片、聚合管道——核心自 4.2–5.0 起稳定。
近期在变(带日期):MongoDB 8.0(2024-10 GA)把查询执行默认切到 SBE(slot-based execution engine),加了 Express 点查快路径、config shard、可查询加密的范围查询;官方称读吞吐较 7.0 提升约 36%。
已成过去式,别再学旧做法:mongo 旧 shell(6.0 移除,改用 mongosh)、MMAPv1 存储引擎(4.2 移除)、默认 w:1 写关注(5.0 起默认 w:majority)、map-reduce(5.0 弃用,用聚合管道)。
许可证:SSPL(2018 起,非 OSI 认可的开源),影响自托管再分发与发行版打包决策。
这份教程会刻意让你卡住——因为"读着顺"不等于"学会了"。带着关系型经验读 MongoDB 尤其危险:很多概念名字相同(索引、事务、复制),机制却不同,熟悉感会盖住差异。出现这三句内心独白时请停下:
· "我读得很顺"——你十有八九还在用关系型的旧 schema 套新词,没真正换模型。
· "我做题很快"——往往只是在背 API,没有在"嵌入还是引用"这种判别题上卡过。
· "我没卡壳"——真正的核心概念(为访问模式建模、持久性≠可见性)会让人卡;没卡说明还没碰到它。
▸概念地图
八个概念,一条自上而下的依赖链。先把这张图记在脑子里,后面每一章都挂在它的某个节点上。
▸三条学习路径
按你来的目的选一条,不必从头读到尾:
| 你的目的 | 建议路径 | 可跳过 |
|---|---|---|
| 只想换对脑子里的模型(为什么文档库不是"无 schema 的表") | 01 → 03 → 07 | 04 / 05 / 06 的分布式细节 |
| 做技术选型 / 评审(该不该上 MongoDB) | 01 → 06 → 07 的判别题 | 02 的聚合 stage 细节 |
| 排查线上慢查询 / 数据一致性问题 | 02 → 04 → 05 | 03 的设计模式枚举 |
▸目录
▸学完之后
这份教程画的是 MongoDB 的核心心智模型。再往外走,下面几个主题会在你的 schema 上各加一块:
- Atlas Search / Vector Search——把全文检索和向量检索做进数据库;在你已有的"文档+聚合"模型上加一个
$searchstage。(本教程刻意没讲,留给你的 vector-database 教程衔接。) - Change Streams——基于 oplog 的变更订阅,把第 05 章的复制机制变成可消费的事件流。
- 时序集合(Time Series Collections)——5.0 起的列式存储集合,把第 04 章的存储模型专门优化给写多读聚合的时序数据。
- Queryable Encryption——在加密状态下做相等 / 范围查询,把安全边界推进到数据库内部。