MongoDB
MongoDB 面试八股。考法和 MySQL 很不一样:MySQL 考机制细节(MVCC 怎么判可见性、锁加在哪),MongoDB 考架构与设计决策(分片键怎么选、文档该嵌入还是引用、什么场景不该用它)。
:::tip 速览 一条主线:文档模型让「一次查询拿到完整对象」成为可能,所以设计的第一原则是「按访问模式建模」而不是按范式拆表;WiredTiger 提供文档级并发和 MVCC,所以写入不再互相阻塞;副本集提供高可用、分片提供水平扩展,两者正交,生产是「分片集群里每个分片都是副本集」。
最该记住的一句话:MongoDB 不是「不需要设计 schema」,而是「schema 设计从写入时转移到了应用层」。 :::
| 条目 | 核心问题 |
|---|---|
| 基础与文档模型 | BSON、_id 与 ObjectId、与关系模型的概念映射 |
| 存储引擎 WiredTiger | B+ 树、文档级锁、MVCC、checkpoint 与 journal |
| 索引 | 索引类型、ESR 规则、覆盖查询、explain 怎么读 |
| 聚合管道 | 常用 stage、$lookup、内存限制、优化 |
| 副本集与高可用 | oplog、选举、readPreference、writeConcern |
| 分片集群 | mongos / config server、chunk、分片键选择 |
| 事务 | 多文档事务、快照隔离、为什么应尽量避免 |
| 数据建模 | 嵌入 vs 引用、设计模式、反模式 |
| 与 MySQL 的区别 | 逐维度对比 + 选型决策 |
高频开场题
MongoDB 是什么? 面向文档的 NoSQL 数据库,数据以类 JSON 的 BSON 文档存储,同一个集合里的文档可以有不同的字段。它在 CAP 里偏向 CP(副本集通过多数派保证一致性),但通过 readPreference / writeConcern 可以在一致性和可用性之间调节。
为什么选 MongoDB? 四个真实理由:
- schema 灵活 —— 字段频繁变化、或不同记录字段差异大(商品属性、埋点日志、第三方 API 返回)时,关系表要么大量 NULL 列要么频繁 DDL
- 嵌套结构天然 —— 一个订单及其明细、一篇文章及其标签,一次读写搞定,不用 JOIN
- 水平扩展内置 —— 分片是官方功能,不需要自己做分库分表中间件
- 开发效率 —— 文档结构和应用对象几乎一一对应,没有 ORM 阻抗失配
什么场景不该用? 这题比上一题更能体现判断力:
- 强事务 + 复杂关联(银行转账、ERP)—— 虽然 4.0+ 支持多文档事务,但性能和成熟度不如 MySQL,且复杂 JOIN 用
$lookup很别扭 - 固定 schema 的结构化数据 —— 用了也没好处,反而失去约束带来的数据质量保障
- 重度 BI / 即席分析 —— 聚合管道写复杂分析比 SQL 痛苦得多,这类需求应该同步到数仓
- 团队不熟 —— 建模不当的 MongoDB 比正常的 MySQL 糟糕得多,而建模错误的修复成本很高
:::note 关于本模块的内容来源 以下内容是公开流传的 MongoDB 面试题整理,覆盖大厂(腾讯 / 百度 / 字节等)常考的方向。按主题而非按公司组织 —— 同一个知识点在不同公司只是问法不同,按主题成体系地理解比背题目列表更有用。标 🔥 的是出现频率最高的。 :::
🔥 最高频的八个问题
| 问题 | 去哪看 |
|---|---|
| MongoDB 和 MySQL 的区别,什么时候用哪个 | 与 MySQL 的区别 |
| 为什么说 MongoDB 写入快? | 存储引擎 |
| 索引用的什么数据结构?和 MySQL 的区别? | 索引 |
| 分片键怎么选?选错了会怎样? | 分片集群 |
| 副本集怎么选主?脑裂怎么防? | 副本集与高可用 |
| 什么时候嵌入、什么时候引用? | 数据建模 |
| MongoDB 支持事务吗?ACID 吗? | 事务 |
| 单文档 16MB 限制怎么绕? | 数据建模 |