跳到正文

MongoDB 学习路线:从文档模型到分布式架构 ​

按「先理解模型,再理解存储与索引,最后理解分布式与设计」的顺序排列。每一层都建立在前一层之上。 生产检查项单独放在 99-生产检查清单,正文讲机制。


学习顺序 ​

L1: MongoDB 是什么、什么时候用
  → 01-核心概念与对比         文档模型、与 MySQL/PgSQL 的定位差异

L2: 数据怎么存、怎么查得快
  → 02-存储模型与WiredTiger   BSON、cache、journal、checkpoint、文档级并发
  → 03-索引                   B 树、ESR、覆盖查询、多键索引、explain

L3: 怎么写查询、怎么优化
  → 04-聚合管道与查询优化      $match/$group/$lookup、管道优化、慢查询

L4: 怎么高可用、怎么扩展
  → 05-副本集与分片           多数派选举、写/读关注、分片键、chunk 与 balancer

L5: 怎么保证多条写原子、怎么订阅变更
  → 06-事务与ChangeStream     多文档事务、两阶段提交、oplog 与 resume token

L6: 数据模型怎么设计
  → 07-Schema设计模式         内嵌 vs 引用、六种模式、查询驱动设计

L7: 生产上容易踩什么、怎么提前发现
  → 08-MongoDB生产踩坑        写关注、分片键、16MB、cache、oplog
  → 10-MongoDB监控指标与告警  主机/进程/副本集与分片/业务四层指标 + cache 与 oplog 两条雪崩链路

L8: AI 场景怎么用
  → 09-MongoDB与AI            $vectorSearch、Atlas 依赖、混合检索

为什么是这个顺序 ​

先理解文档模型(L1),才知道 Schema 设计(L6)为什么是核心决策,
而不是「随便存 JSON」。

先理解 WiredTiger(L2),才知道 cache、journal、checkpoint 分别影响
什么:cache 影响常态性能,journal + 写关注影响丢不丢数据,
checkpoint 影响恢复时间。

先理解索引(L2)和聚合(L3),才知道慢查询该补索引、改管道,
还是该换数据模型。

先理解副本集(L4),才知道写关注和读关注不是「越高越好」,
而是在一致性、延迟和可用性之间做取舍。

最后用生产踩坑(L7)和 Schema 设计(L6)把前面的机制落到模型上:
MongoDB 与关系库最大的差异,不是语法,而是「查询驱动设计」。

核心链路 ​

应用写入
    │
    ▼
WiredTiger Cache(内存脏页)── 02-存储模型
    ├── journal(WAL,100ms 批量提交)── 崩溃恢复
    └── checkpoint(至少每 60s)── 一致快照落盘
    │
    ▼
索引定位(B 树 + ESR)── 03-索引
    │
    ▼
聚合管道($match → $group → $lookup)── 04-聚合管道
    │
    ▼
副本集复制(oplog → Secondary)── 05-副本集
    ├── Write Concern:写到多少个节点才算成功
    ├── Read Concern:读到哪个一致点
    └── Read Preference:从主节点还是从节点读
    │
    ▼
分片路由(mongos → Config Server → Shard)── 05-分片
    │
    ▼
事务协调(跨分片 2PC)── 06-事务
    │
    ▼
Change Stream(oplog 变更订阅)── 06-ChangeStream

顺着链路理解 ​

  • 和关系库怎么选:L1 的模型差异 + L6 的 Schema 设计共同决定;事务和复杂关联留在 MySQL/PgSQL。
  • 为什么写快、读也快:L2 的文档级并发和 cache,加上 L3 的索引设计;不是「MongoDB 一定比 MySQL 快」。
  • 怎么保证不丢:L4 的写关注 + L2 的 journal,两者回答不同层面的问题;w:"majority" 防切换丢数据,j:true 防进程崩溃丢数据。
  • 怎么提前发现故障:10 篇用「连接与队列 → oplog → cache 脏页 → 磁盘 → 慢查询」的处置顺序,把 cache/checkpoint 和复制窗口这两条雪崩链路串起来。
  • Schema 怎么设计:L6 的内嵌 vs 引用,判据是查询模式和数据增长边界,不是「关系看起来像一对多」。
  • AI 场景怎么用:L8 的 $vectorSearch 与 Atlas/自建版本绑定,先确认部署形态再决定。

把一门技术讲透到既懂也会用