共计 4960 个字符,预计需要花费 13 分钟才能阅读完成。
初级(20 题)
- MongoDB 是什么?与关系型数据库的核心区别?
MongoDB 是文档型数据库,数据以 BSON 文档存储(支持嵌套对象 / 数组、灵活模式),通常用索引优化查询并支持丰富的聚合能力;与关系型数据库(表 / 行 / 列、固定 schema)不同,MongoDB 更强调按访问路径建模与去范式。(MongoDB) - BSON 是什么?单个文档的大小限制是多少?
BSON(Binary JSON)是 MongoDB 的二进制文档格式,利于高效存储与类型扩展;单个文档的大小上限为 16MB。(geek-docs.com) - 何时使用 GridFS?
当单个文件大于 16MB 或需要分片存储 / 并行传输 / 断点续传时,用 GridFS 将大文件切块存储在两个集合中(fs.files/fs.chunks)。(CSDN 博客) - 集合 (Collection) 与文档(Document) 的关系?
集合相当于文档的容器;同一集合内文档结构可不同(灵活 schema),也可通过 模式验证 约束结构。(MongoDB) - 基本查询与投影如何写?
使用db.collection.find(query, projection),投影可按1/0包含或排除字段,也可使用聚合表达式投影新字段。
示例:db.users.find({age:{$gte:18}}, {name:1, age:1, _id:0})。(MongoDB) explain()有什么用?常用哪个模式?explain()展示查询的执行计划与关键指标(如是否走索引、扫描量、耗时);常用executionStats模式观察实际执行统计。(mongodb.ac.cn)- 为什么需要索引?如何创建唯一索引?
索引能显著减少扫描量、加速过滤与排序;创建唯一索引:db.members.createIndex({user_id:1},{unique:true})。创建集合时_id自带唯一索引。(MongoDB) - 有哪些索引类型?
常见:单字段、复合、多键 (数组)、 文本 、 哈希、2dsphere(地理)、TTL 等,不同类型应对不同查询场景。(MongoDB) - 多键索引(Multikey)如何工作?
当被索引字段是数组时,MongoDB 会为数组中每个元素建立索引键,用于匹配 / 排序;多键索引有组合与排序限制。(MongoDB) - 复合索引与“ESR(等值 - 排序 - 范围)”规则是什么?
复合索引字段顺序影响可用性与排序支持;优先将 等值 匹配字段放前,再 排序 字段,最后 范围 字段,并牢记“前缀原则”。(mongodb.ac.cn) - 什么是覆盖查询(Covered Query)?
当查询条件与返回字段 全部 被同一个索引覆盖时,无需回表读取文档,性能最佳;分片集合要覆盖查询需索引包含分片键。(MongoDB) - 部分索引(Partial Index)解决什么问题?
只为满足partialFilterExpression的文档建索引,降低索引体积、提升写入;可与唯一约束组合,但唯一性仅作用于过滤后的子集。(MongoDB) - 通配符索引(Wildcard,
$**)适用场景?
当字段名动态 / 未知时对“任意或一组字段”建索引;它是稀疏索引,不支持$text,若需索引_id必须显式在投影中包含。(MongoDB) - TTL 索引如何使用?
对日期 / 时间字段建立expireAfterSeconds索引,文档过期后由后台线程清理:db.logs.createIndex({createdAt:1},{expireAfterSeconds:3600})。(MongoDB) - 排序规则(Collation)有什么用?
控制字符串比较 / 排序的本地化行为(大小写 / 重音敏感度等),可在集合 / 索引 / 查询级别指定。(MongoDB) hint()的作用与限制?hint()强制使用某个索引或强制集合扫描({$natural:1});含$text查询或指向隐藏 / 不存在索引会报错。(mongodb.ac.cn)- 读写相关:Read Preference/Read Concern/Write Concern 是什么?
- Read Preference:读路由策略(如
primary、secondary)。 - Read Concern:读一致性级别(如
local、majority、snapshot)。 - Write Concern:写确认级别(如
w:majority、j:true)。(MongoDB)
- 模式验证(Schema Validation)怎么做?
用$jsonSchema在集合级定义验证规则,并通过validationLevel/validationAction控制严格度与处置方式。(MongoDB) - MongoDB 文档中数组查询常见注意点?
数组字段匹配与排序受 多键索引 规则影响;数组元素过滤可用$elemMatch,投影时可用"<field>.$":1返回匹配元素。(MongoDB) - 聚合框架的定位?
Aggregation Pipeline 提供阶段式数据处理(如$match、$group、$project、$lookup等),用于分析、汇总与复杂数据转换。(MongoDB)
中级(20 题)
- 文本索引与
$text查询如何使用?
为字符串字段建 文本索引 后,可用{$text: { $search: "phrase"} }做全文搜索;文本索引不能与通配符索引混用。(MongoDB) - 地理位置查询用哪个索引?
用 2dsphere 索引支持球面几何查询($near,$geoWithin等),适用于经纬度点 / 多边形等。(MongoDB) - 索引交集(Index Intersection)是什么?
规划器可将多个索引的结果做交集以满足一个查询(当无单一合适索引时),但并非所有情形都更快,应以explain()验证。(MongoDB) - 隐藏索引(Hidden Index)有什么用?
将索引对查询优化器隐藏以评估“删索引”的影响,若影响负面可“取消隐藏”恢复,无需重建。(MongoDB) - 如何判断查询是否“只走索引不回表”?
查看explain().executionStats的stage/indexOnly/keysExamined/docsExamined等;覆盖查询通常docsExamined:0。分片集合要覆盖需索引包含分片键。(mongodb.ac.cn) - 连接池状态如何查看?
使用db.adminCommand({connPoolStats:1})查看连接池统计(与驱动连接池相关)。(MongoDB) - 写入安全与持久化:
journal/WiredTiger Checkpoint 概念?
WiredTiger 通过 journaling 与 checkpoint 协同实现崩溃恢复;journal记录增量日志,checkpoint 周期性持久化一致性快照。(MongoDB) - 副本集与读偏好如何影响延迟与一致性?
读secondary可降低主节点压力但可能读到延迟数据;用readConcern("majority")提升一致性、以牺牲延迟为代价。(MongoDB) - 事务(Transactions)支持范围?
MongoDB 支持多文档事务;自 4.2 起 支持跨分片事务,但需权衡开销与超时。(mongodb.ac.cn) - 重试写(Retryable Writes)是什么?
驱动自动重试幂等写操作以应对短暂网络 / 故障切换(通常结合_id去重);需部署与驱动共同支持。(mongodb.ac.cn) - Change Streams 能做什么?
基于副本集 oplog 的实时变更订阅,可对集合 / 数据库 / 集群级别监听插入、更新、删除等事件。(mongodb.ac.cn) - 聚合中的
$lookup/$graphLookup用途?$lookup跨集合连接;$graphLookup进行递归 / 路径式遍历查询。(MongoDB) - 分页为何推荐“基于范围”的 Seek 方法而不是深度
skip?
深度skip会扫描并丢弃大量记录;基于 索引字段范围(如createdAt < lastSeen)能显著减少扫描与排序压力。官方“查询优化”建议通过索引、投影与限制结果来降低扫描成本。(MongoDB) - 时间序列集合(Time Series)有什么特性?
为大量按时间写入的度量场景做存储 / 压缩 / 查询优化;可结合 TTL 自动过期历史数据。(MongoDB) - 哈希索引与哈希分片(Hashed Sharding)适用场景?
哈希分片能更均匀地分布数据(尤其单调增长键),但降低了“定向查询”的比例(更可能广播)。(MongoDB) - 如何选择分片键?
综合考虑 基数 、 频率分布 、 单调性 与查询模式 ,必要时使用 复合分片键;7.0 起可用analyzeShardKey评估候选键。(mongodb.ac.cn) - 分片块(Chunk)尺寸与迁移机制?
数据按分片键范围切分为 chunk(默认128MB);平衡器负责迁移以维持均衡,遇到 jumbo chunk 可通过优化键或 refine/reshard 化解。(MongoDB) - 更改 / 优化分片键有哪些手段?
4.4 起支持 refineShardKey(在原键后追加后缀字段);5.0 起可 reshard 改变分片键(代价更高)。(MongoDB) - 唯一索引在分片集合上的限制?
除_id外,分片集合上 只有分片键 或“以分片键为前缀 的复合索引”可以是唯一索引。(mongodb.net.cn) - 安全基础:认证与角色
MongoDB 默认支持 SCRAM-SHA-256 认证;通过 角色 / 权限(RBAC)精细授权,可结合 TLS 保障链路安全。(MongoDB)
高级(10 题)
- 如何系统化定位慢查询?
结合explain("executionStats")、Profiler、$currentOp、serverStatus与索引统计($indexStats)定位瓶颈,再通过索引 / 重写查询 / 数据模型优化落地。(mongodb.ac.cn) - 复合索引的排序支持有哪些“方向性”注意点?
复合索引的字段顺序与升 / 降序会直接决定能否利用索引完成排序;遵循 ESR 并合理设计方向以避免内存排序。(mongodb.ac.cn) - 多键复合索引的限制与设计取舍?
数组参与复合索引时会产生多键组合,可能限制排序与$nin/ 范围组合能力;尽量让数组字段靠后或单独设计索引。(MongoDB) - 部分索引 + 唯一约束有哪些边界?
唯一性仅在满足partialFilterExpression的文档子集内生效;7.3 起禁止创建“等效部分索引”重复体。(MongoDB) - 事务与读写关注的组合策略?
在事务中使用readConcern: "snapshot"与writeConcern: {w:"majority"}常见;跨分片事务开销更大,应仅在必要时启用并收敛业务范围。(mongodb.ac.cn) - Change Streams 的正确使用姿势?
限定监听范围(库 / 集合)、为 resume token 做持久化、处理分片拓扑下的事件顺序与重试,必要时配合fullDocument选项。(mongodb.ac.cn) - WiredTiger 的持久化与崩溃恢复原理要点?
通过 WAL(journal)+ checkpoint 协作,崩溃后先回放日志再落盘快照,保证数据一致性,同时利用压缩与缓存管理提升性能。(MongoDB) - 通配符索引的性能 / 功能边界?
适配动态字段但索引体积与维护成本可能较高;不支持$text,需要索引_id时须在通配符投影中显式包含。(MongoDB) - 时间序列与“桶模式(Bucket Pattern)”如何配合?
时间序列集合底层已按时间 / 度量进行高效分组与压缩;在通用集合建模中也可用“桶模式”按时间窗口 / 范围归并,降低写放大与查询扫描。(MongoDB) - 数据建模的常见反模式与规避?
避免 无界数组 、 集合数量爆炸 、 过度嵌套 等;根据查询路径选择“嵌入 vs 引用”,必要时采用官方 模式设计模式(如 Attribute/Subset/Bucket/Outlier)。(MongoDB)
小贴士(练题建议)
- 先做初级题巩固“索引 / 查询 / 聚合”基石,再过中级题掌握“副本集 / 分片 / 事务 / 变更流”,最后用高级题对“调优 / 建模 / 时序 / 索引细节”查缺补漏。
- 每次写查询前先想“索引如何利用 ”“ 是否能被覆盖 ”“ 是否能按范围分页”。
- 多用
explain()验证你的直觉。
正文完

