共计 3208 个字符,预计需要花费 9 分钟才能阅读完成。
一、基础概念与优劣势
1)MongoDB 的优势
- 文档模型灵活(Schema 可演进),字段可索引,天然适配多样数据结构与快速迭代。(MongoDB)
- 易做水平扩展与高可用:副本集(高可用)、分片(水平扩展)。(博客园)
- 生态完善,驱动 / 工具齐全;聚合框架表达力强,支持向量 / 地理空间 / 文本等索引类型。(MongoDB)
2)MongoDB 的工作原理(更正)
- 存储格式:以 BSON(二进制 JSON) 存储与传输。(MongoDB)
- 复制:副本集 通过 oplog 复制与选举保障高可用。(MongoDB)
- 事务:自 4.0 起支持副本集多文档事务,自 4.2 起支持跨分片(分布式)事务,并非“不支持跨节点事务”。(mongodb.net.cn)
二、数据模型与数据类型
3)数据存储格式与文档大小限制
- BSON 文档;单文档最大默认 16MB。大文件请用 GridFS。(MongoDB)
4)常见数据类型
- String、Int/Long/Double/Decimal128、Boolean、Date、ObjectId、Array、Object、Binary、Regex、Timestamp、MinKey/MaxKey 等(BSON 类型)。(MongoDB)
三、索引与查询优化
5)索引类型(会被问到的清单)
- 单字段、复合、多键(数组)、地理空间(2d/2dsphere)、文本 、 哈希 、 通配符(wildcard)、(以及新版本的)聚簇索引 / 聚簇集合。(MongoDB)
6)如何创建索引?如何做部分索引?唯一索引?
db.collection.createIndex({field: 1}, {unique: true});部分索引 用partialFilterExpression仅索引满足条件的文档。(MongoDB)
7)数组 / 嵌套字段的索引(多键索引)注意点
- 数组字段建索引会自动成为 多键索引;复合多键索引受限(同一文档中最多一个索引字段是数组)。(mongodb.ac.cn)
8)常见查询与排序
- 基本查询:
db.col.find({key: value}, {projection});格式化输出:find().pretty()(mongosh 里可用)。(MongoDB) - 排序:
sort({field: 1|-1})。(MongoDB)
9)聚合(Aggregation)
- 通过
db.col.aggregate([{ $match: …}, {$group: …}, {$project: …} ])进行分组 / 汇总 / 统计,是多表 Join/ETL/ 报表的核心工具。(MongoDB)
10)查询性能优化要点
- 针对高频过滤 / 排序字段建立合适索引(必要时复合索引、部分索引、通配符索引);
- 尽量避免让函数包裹索引字段导致索引失效;
- 只取需要的字段(Projection),限制结果集大小;
- 善用聚合管道一次完成筛选 / 汇总;
- 使用
explain()分析执行计划并验证走索引情况。(MongoDB)
四、写入、事务、持久化
11)写入落盘与持久化(更正)
- MongoDB 通过 journal(约每 100ms 组提交) 与 WiredTiger checkpoint(默认约 60 秒) 机制保证持久化;是否“立刻 fsync”取决于 writeConcern/journal 设置,并非“默认 60 秒后才落盘”。(MongoDB)
12)事务与隔离
- 多文档 ACID 事务(副本集 4.0、分片 4.2);使用事务要权衡性能开销与数据模型(很多场景嵌入式文档更优)。(mongodb.net.cn)
五、高可用与复制集(副本集)
13)成员类型与配置(考点)
- Primary(主)/Secondary(从)/Arbiter(仲裁);
- Hidden(隐藏):不对客户端可见,通常用于备份 / 报表,必须 priority=0。(MongoDB)
- Priority 0:不可当选 Primary。(MongoDB)
- Non-voting(不投票):
votes=0, priority=0,常用于读扩展而不影响投票数。(mongodb.ac.cn) - Delayed(延迟):
secondaryDelaySecs + hidden + priority=0,用于容灾回滚窗口。(MongoDB)
六、分片(Sharding)与可扩展性
14)何时扩展到多个分片?默认块大小(更正)
- 基于 范围 /range按分片键划分“范围(旧称 chunk)”;默认范围大小为 128MB(非 64MB),可调整。(MongoDB)
15)GridFS 与大文件
- 单文档上限 16MB,大文件请使用 GridFS(把大文件切分为多个 chunk 文档存储并聚合访问)。(MongoDB)
七、常用 CRUD 与管理命令(最新写法)
- 查询:
db.col.find(filter, projection).sort().skip().limit();格式化:pretty()。(MongoDB) - 创建索引:
db.col.createIndex({f1: 1, f2: -1}, {unique: true});部分索引partialFilterExpression。(MongoDB) - 更新 :
updateOne/updateMany(4.2 起支持 聚合管道更新)。(MongoDB) - 删除:
deleteOne/deleteMany(优先使用,而非旧的 remove)。(MongoDB) - 连接池 / 连出连接统计:
db.runCommand({connPoolStats: 1})或db.adminCommand(...)。(MongoDB)
八、高频面试 Q&A 速览
Q1:MongoDB 与关系型数据库差异?
- 文档 vs 表;灵活 Schema vs 固定 Schema;二级索引丰富;分片扩展简单;但复杂跨集合事务 / 联表查询需权衡数据模型与聚合框架。(MongoDB)
Q2:聚合框架能做什么?
- 过滤 / 投影 / 分组 / 排序 / 关联($lookup)/ 窗口运算等,支撑报表与分析。(MongoDB)
Q3:如何排查“索引没用上”?
db.col.find(...).explain("executionStats")看IXSCAN是否出现;检查过滤、排序字段与索引是否匹配、是否函数包裹字段等。(MongoDB)
Q4:分页深页优化?
- 使用“锚点 / 游标式分页”(基于上次最后一条的排序键继续查),减少
skip开销;并为排序键建索引。(MongoDB)
Q5:什么场景适合 MongoDB?
- 单视图、内容管理、实时分析、个性化推荐、移动 /IoT、地理空间数据等。官方也给出场景指引。(MongoDB)
九、简答题模板(可直接背)
- 什么是副本集? 一组 mongod 实例维持同一数据集,通过选举确保高可用,Primary 负责写入,Secondary 复制 oplog。(MongoDB)
- 什么是 GridFS?为什么要用? 为突破 16MB 文档上限将大文件拆块存储与检索的规范。(MongoDB)
- 通配符索引适用场景? 动态 / 未知字段集合(如用户自定义字段);是稀疏索引,不支持
$text。(MongoDB) - 延迟从节点的作用? 提供回滚窗口用于容灾,配置
secondaryDelaySecs + hidden + priority=0。(MongoDB) - 默认范围(chunk)大小? 128MB,可按需调整。(MongoDB)
十、加分:几道易踩坑的“更正题”
正文完

