MongoDB 是主流的文档型 NoSQL 数据库以灵活的文档模型、高性能、易扩展著称是 Java 后端面试中 NoSQL 模块的核心考点重点考存储原理、索引、副本集、分片、与 MySQL 对比、性能优化。一、MongoDB 核心原理先懂原理再背题1.1 核心特性文档型数据库数据以 BSON二进制 JSON格式存储支持嵌套文档、数组无固定表结构.schema-less高性能内存映射存储、索引优化、WiredTiger 存储引擎默认支持压缩 / 并发高可用副本集Replica Set实现主从备份、自动故障转移水平扩展分片集群Sharding支持海量数据分布式存储原生支持分布式事务4.0、地理空间索引、全文索引。1.2 存储核心原理1数据格式BSONBSON 是二进制编码的 JSON支持更多数据类型Date、Int64、ObjectId、Binary 等每个文档有唯一_id字段默认自动生成 ObjectId可自定义作为主键。2核心存储引擎面试高频存储引擎特点适用场景WiredTiger默认支持行级锁、压缩Snappy/Zlib、MVCC、事务生产环境首选高并发、大数据量MMAPv1废弃表级锁、内存映射文件低版本兼容已淘汰3数据存储结构命名空间Namespace数据库名.集合名如test.user数据文件按预分配策略生成默认 2GB 递增避免频繁磁盘 IO日志机制Journal 日志预写日志WAL默认 100ms 刷盘崩溃后可恢复Oplog 日志副本集数据同步日志固定大小的循环日志。1.3 索引核心原理1索引结构B 树和 MySQL 一致所有索引基于 B 树构建叶子节点存储文档地址磁盘指针主键_id默认为唯一索引不可删除。2常见索引类型必考索引类型作用适用场景单字段索引单个字段的升序 / 降序索引单条件查询如where name 张三复合索引多个字段组合的索引多条件查询如where age 20 and gender 男唯一索引保证字段值唯一手机号、邮箱等唯一标识地理空间索引支持地理位置查询如附近的人LBS 应用外卖、打车文本索引支持全文检索文章、商品标题搜索哈希索引按字段哈希值索引分片集群的分片键均匀分布数据3索引优化原则最左前缀匹配复合索引需按查询频率排序字段避免覆盖低基数字段如性别、状态用explain()分析查询计划避免全表扫描COLLSCAN索引不是越多越好写入时需维护索引增加开销。1.4 副本集Replica Set原理高可用核心1核心角色主节点Primary读写操作唯一可写节点从节点Secondary只读同步主节点 Oplog 数据仲裁节点Arbiter无数据仅参与选举可选集群节点为偶数时用。2选举机制Raft 协议集群节点数为奇数3/5/7满足多数派选举主节点宕机 → 从节点竞选 Leader优先级高、数据最新Oplog 同步完成、获得多数投票的节点胜出选举完成后新主节点对外提供服务原主节点恢复后变为从节点。3数据同步主节点写入数据 → 记录 Oplog → 从节点拉取 Oplog 重放 → 数据一致同步模式异步同步默认、半同步确保至少一个从节点同步完成再返回。1.5 分片集群Sharding原理水平扩展核心1核心组件mongos路由节点接收客户端请求转发到对应分片config server配置服务器存储集群元数据分片键、分片节点信息shard分片节点通常是副本集存储实际数据。2分片策略范围分片按分片键范围划分如按时间、ID 范围易数据倾斜哈希分片按分片键哈希值划分数据分布均匀不支持范围查询优化标签分片自定义分片规则如按地区映射到指定分片。二、MongoDB 高频面试题分模块直接背一、基础必问题开场 90% 问1. MongoDB 是什么核心特点MongoDB 是文档型 NoSQL 数据库核心特点无模式schema-lessBSON 文档存储灵活适配业务变更高性能内存映射、索引优化、高可用副本集、水平扩展分片支持丰富索引地理空间、文本、分布式事务。2. MongoDB 的 BSON 是什么和 JSON 区别BSON 是二进制编码的 JSONMongoDB 原生存储格式区别支持更多数据类型Date、Int64、ObjectId 等、二进制存储更高效、易解析。3. MongoDB 的_id字段作用ObjectId 构成_id是文档唯一主键默认自动生成 ObjectId不可重复ObjectId12 字节构成时间戳4 字节创建时间机器 ID3 字节服务器标识进程 ID2 字节避免同机器多进程冲突自增序列3 字节同一进程内唯一。4. MongoDB 支持的数据类型有哪些基础类型字符串、数字int/long/double、布尔、日期、null特殊类型ObjectId、数组、嵌套文档、二进制数据、正则表达式。二、原理深度题中高级必问5. MongoDB 索引类型有哪些复合索引的最左前缀原则索引类型单字段、复合、唯一、地理空间、文本、哈希索引最左前缀复合索引{a:1, b:1, c:1}仅对a、ab、abc查询生效对b、bc查询不生效。6. 如何优化 MongoDB 查询性能必考建立合适索引避免全表扫描COLLSCAN用projection只返回需要的字段减少数据传输分页用skip()limit()优化大数据量用_id范围分页避免大文档拆分嵌套文档开启 WiredTiger 压缩减少磁盘 IO用explain()分析查询计划优化慢查询。7. MongoDB 副本集的作用选举机制作用高可用故障自动转移、读写分离主写从读、数据备份选举基于 Raft 协议奇数节点、多数派投票优先级高 数据最新的从节点胜出。8. MongoDB 分片集群的核心组件分片键如何选择核心组件mongos路由、config server配置、shard分片节点分片键选择原则高频查询字段数据分布均匀避免倾斜尽量不变更分片键不可修改范围查询用范围分片无范围用哈希分片。9. MongoDB 的事务支持和 MySQL 事务区别MongoDB 4.0 支持副本集事务4.4 支持分片集群事务区别MySQLACID 完全支持锁粒度细行级MongoDB仅支持单文档事务默认多文档事务需显式开启性能略低于 MySQL适合非核心业务。10. Journal 日志和 Oplog 日志区别Journal预写日志WAL用于崩溃恢复保障数据持久化Oplog副本集同步日志固定大小循环日志记录主节点所有写操作。三、实战 对比题生产经验11. MongoDB vs MySQL最常问特性MongoDBMySQL数据模型文档型无模式关系型固定表结构事务支持多文档 / 分布式事务弱强 ACID 事务索引B 树、地理空间、文本索引B 树、全文索引需插件扩展水平扩展分片易水平扩展复杂分库分表适用场景非结构化 / 半结构化数据日志、用户画像、LBS结构化数据订单、支付、核心业务12. Spring Data MongoDB 常用注解Document标记实体类对应 MongoDB 集合Id指定主键字段对应_idField指定字段名映射集合字段Indexed标记索引字段CompoundIndex标记复合索引。13. MongoDB 写入性能优化批量写入bulkWrite代替单条插入关闭不必要的索引写入时临时关闭写完重建禁用 Journal 日志测试环境生产不建议调整写入关注级别w:1仅主节点确认默认w:majority使用内存映射提升写入速度。14. MongoDB 数据迁移 / 备份方案备份mongodump逻辑备份、文件系统快照物理备份恢复mongorestore迁移副本集同步、mongodump mongorestore、分片集群数据迁移工具。15. 什么是数据倾斜分片集群如何避免数据倾斜某分片存储数据远多于其他分片如分片键选择不当避免选择均匀分布的分片键如用户 ID 哈希用标签分片手动分配数据定期迁移分片数据balancer 自动均衡。四、生产排查题实战向16. MongoDB 查询慢的排查思路用db.collection.find().explain()看执行计划是否走索引IXSCAN、是否全表扫描COLLSCAN检查索引是否缺失 / 失效查看慢查询日志开启 profiling检查服务器资源CPU / 内存 / 磁盘 IO检查文档大小大文档导致查询耗时。17. 副本集主节点宕机从节点不选举的原因集群节点数为偶数无仲裁节点无法形成多数派从节点优先级为 0不可竞选主节点从节点数据落后主节点过多Oplog 覆盖网络分区从节点无法通信。18. MongoDB 内存占用过高原因WiredTiger 缓存设置过大默认占物理内存 50%索引过多内存映射文件占用高大量慢查询导致内存无法释放大文档频繁读取缓存未淘汰。19. 如何保证 MongoDB 数据一致性副本集同步Oplog 重放写入关注级别设为w:majority多数节点确认写入开启 Journal 日志崩溃恢复关键业务用分布式事务。20. MongoDB 不适合的场景强事务要求的核心业务如金融支付复杂多表关联查询MongoDB 关联查询性能差固定结构、低变更的结构化数据。三、面试一句话核心总结快速记忆MongoDB 是文档型 NoSQLBSON 存储副本集高可用 分片水平扩展索引基于 B 树复合索引遵循最左前缀用explain()优化查询副本集选举靠 Raft 协议奇数节点 多数派投票分片键选均匀分布字段避免数据倾斜对比 MySQLMongoDB 灵活易扩展MySQL 事务强核心业务选 MySQL。