mongodb入土笔记续

67次阅读
没有评论

共计 4960 个字符,预计需要花费 13 分钟才能阅读完成。

初级(20 题)

  1. MongoDB 是什么?与关系型数据库的核心区别?
    MongoDB 是文档型数据库,数据以 BSON 文档存储(支持嵌套对象 / 数组、灵活模式),通常用索引优化查询并支持丰富的聚合能力;与关系型数据库(表 / 行 / 列、固定 schema)不同,MongoDB 更强调按访问路径建模与去范式。(MongoDB)
  2. BSON 是什么?单个文档的大小限制是多少?
    BSON(Binary JSON)是 MongoDB 的二进制文档格式,利于高效存储与类型扩展;单个文档的大小上限为 16MB。(geek-docs.com)
  3. 何时使用 GridFS?
    当单个文件大于 16MB 或需要分片存储 / 并行传输 / 断点续传时,用 GridFS 将大文件切块存储在两个集合中(fs.files / fs.chunks)。(CSDN 博客)
  4. 集合 (Collection) 与文档(Document) 的关系?
    集合相当于文档的容器;同一集合内文档结构可不同(灵活 schema),也可通过 模式验证 约束结构。(MongoDB)
  5. 基本查询与投影如何写?
    使用 db.collection.find(query, projection),投影可按 1/0 包含或排除字段,也可使用聚合表达式投影新字段。
    示例:db.users.find({age:{$gte:18}}, {name:1, age:1, _id:0})。(MongoDB)
  6. explain() 有什么用?常用哪个模式?
    explain() 展示查询的执行计划与关键指标(如是否走索引、扫描量、耗时);常用 executionStats 模式观察实际执行统计。(mongodb.ac.cn)
  7. 为什么需要索引?如何创建唯一索引?
    索引能显著减少扫描量、加速过滤与排序;创建唯一索引:
    db.members.createIndex({user_id:1},{unique:true})。创建集合时 _id 自带唯一索引。(MongoDB)
  8. 有哪些索引类型?
    常见:单字段、复合、多键 (数组)、 文本 哈希2dsphere(地理)、TTL 等,不同类型应对不同查询场景。(MongoDB)
  9. 多键索引(Multikey)如何工作?
    当被索引字段是数组时,MongoDB 会为数组中每个元素建立索引键,用于匹配 / 排序;多键索引有组合与排序限制。(MongoDB)
  10. 复合索引与“ESR(等值 - 排序 - 范围)”规则是什么?
    复合索引字段顺序影响可用性与排序支持;优先将 等值 匹配字段放前,再 排序 字段,最后 范围 字段,并牢记“前缀原则”。(mongodb.ac.cn)
  11. 什么是覆盖查询(Covered Query)?
    当查询条件与返回字段 全部 被同一个索引覆盖时,无需回表读取文档,性能最佳;分片集合要覆盖查询需索引包含分片键。(MongoDB)
  12. 部分索引(Partial Index)解决什么问题?
    只为满足 partialFilterExpression 的文档建索引,降低索引体积、提升写入;可与唯一约束组合,但唯一性仅作用于过滤后的子集。(MongoDB)
  13. 通配符索引(Wildcard,$**)适用场景?
    当字段名动态 / 未知时对“任意或一组字段”建索引;它是稀疏索引,不支持 $text,若需索引 _id 必须显式在投影中包含。(MongoDB)
  14. TTL 索引如何使用?
    对日期 / 时间字段建立 expireAfterSeconds 索引,文档过期后由后台线程清理:
    db.logs.createIndex({createdAt:1},{expireAfterSeconds:3600})。(MongoDB)
  15. 排序规则(Collation)有什么用?
    控制字符串比较 / 排序的本地化行为(大小写 / 重音敏感度等),可在集合 / 索引 / 查询级别指定。(MongoDB)
  16. hint() 的作用与限制?
    hint() 强制使用某个索引或强制集合扫描({$natural:1});含 $text 查询或指向隐藏 / 不存在索引会报错。(mongodb.ac.cn)
  17. 读写相关:Read Preference/Read Concern/Write Concern 是什么?
  • Read Preference:读路由策略(如 primarysecondary)。
  • Read Concern:读一致性级别(如 localmajoritysnapshot)。
  • Write Concern:写确认级别(如 w:majorityj:true)。(MongoDB)
  1. 模式验证(Schema Validation)怎么做?
    $jsonSchema 在集合级定义验证规则,并通过 validationLevel/validationAction 控制严格度与处置方式。(MongoDB)
  2. MongoDB 文档中数组查询常见注意点?
    数组字段匹配与排序受 多键索引 规则影响;数组元素过滤可用 $elemMatch,投影时可用 "<field>.$":1 返回匹配元素。(MongoDB)
  3. 聚合框架的定位?
    Aggregation Pipeline 提供阶段式数据处理(如 $match$group$project$lookup 等),用于分析、汇总与复杂数据转换。(MongoDB)

中级(20 题)

  1. 文本索引与 $text 查询如何使用?
    为字符串字段建 文本索引 后,可用 {$text: { $search: "phrase"} } 做全文搜索;文本索引不能与通配符索引混用。(MongoDB)
  2. 地理位置查询用哪个索引?
    2dsphere 索引支持球面几何查询($near, $geoWithin 等),适用于经纬度点 / 多边形等。(MongoDB)
  3. 索引交集(Index Intersection)是什么?
    规划器可将多个索引的结果做交集以满足一个查询(当无单一合适索引时),但并非所有情形都更快,应以 explain() 验证。(MongoDB)
  4. 隐藏索引(Hidden Index)有什么用?
    将索引对查询优化器隐藏以评估“删索引”的影响,若影响负面可“取消隐藏”恢复,无需重建。(MongoDB)
  5. 如何判断查询是否“只走索引不回表”?
    查看 explain().executionStatsstage/indexOnly/keysExamined/docsExamined 等;覆盖查询通常 docsExamined:0。分片集合要覆盖需索引包含分片键。(mongodb.ac.cn)
  6. 连接池状态如何查看?
    使用 db.adminCommand({connPoolStats:1}) 查看连接池统计(与驱动连接池相关)。(MongoDB)
  7. 写入安全与持久化:journal/WiredTiger Checkpoint 概念?
    WiredTiger 通过 journalingcheckpoint 协同实现崩溃恢复;journal 记录增量日志,checkpoint 周期性持久化一致性快照。(MongoDB)
  8. 副本集与读偏好如何影响延迟与一致性?
    secondary 可降低主节点压力但可能读到延迟数据;用 readConcern("majority") 提升一致性、以牺牲延迟为代价。(MongoDB)
  9. 事务(Transactions)支持范围?
    MongoDB 支持多文档事务;自 4.2 起 支持跨分片事务,但需权衡开销与超时。(mongodb.ac.cn)
  10. 重试写(Retryable Writes)是什么?
    驱动自动重试幂等写操作以应对短暂网络 / 故障切换(通常结合 _id 去重);需部署与驱动共同支持。(mongodb.ac.cn)
  11. Change Streams 能做什么?
    基于副本集 oplog 的实时变更订阅,可对集合 / 数据库 / 集群级别监听插入、更新、删除等事件。(mongodb.ac.cn)
  12. 聚合中的 $lookup / $graphLookup 用途?
    $lookup 跨集合连接;$graphLookup 进行递归 / 路径式遍历查询。(MongoDB)
  13. 分页为何推荐“基于范围”的 Seek 方法而不是深度 skip
    深度 skip 会扫描并丢弃大量记录;基于 索引字段范围(如 createdAt < lastSeen)能显著减少扫描与排序压力。官方“查询优化”建议通过索引、投影与限制结果来降低扫描成本。(MongoDB)
  14. 时间序列集合(Time Series)有什么特性?
    为大量按时间写入的度量场景做存储 / 压缩 / 查询优化;可结合 TTL 自动过期历史数据。(MongoDB)
  15. 哈希索引与哈希分片(Hashed Sharding)适用场景?
    哈希分片能更均匀地分布数据(尤其单调增长键),但降低了“定向查询”的比例(更可能广播)。(MongoDB)
  16. 如何选择分片键?
    综合考虑 基数 频率分布 单调性 查询模式 ,必要时使用 复合分片键;7.0 起可用 analyzeShardKey 评估候选键。(mongodb.ac.cn)
  17. 分片块(Chunk)尺寸与迁移机制?
    数据按分片键范围切分为 chunk(默认128MB);平衡器负责迁移以维持均衡,遇到 jumbo chunk 可通过优化键或 refine/reshard 化解。(MongoDB)
  18. 更改 / 优化分片键有哪些手段?
    4.4 起支持 refineShardKey(在原键后追加后缀字段);5.0 起可 reshard 改变分片键(代价更高)。(MongoDB)
  19. 唯一索引在分片集合上的限制?
    _id 外,分片集合上 只有分片键 或“以分片键为前缀 的复合索引”可以是唯一索引。(mongodb.net.cn)
  20. 安全基础:认证与角色
    MongoDB 默认支持 SCRAM-SHA-256 认证;通过 角色 / 权限(RBAC)精细授权,可结合 TLS 保障链路安全。(MongoDB)

高级(10 题)

  1. 如何系统化定位慢查询?
    结合 explain("executionStats")、Profiler、$currentOpserverStatus 与索引统计($indexStats)定位瓶颈,再通过索引 / 重写查询 / 数据模型优化落地。(mongodb.ac.cn)
  2. 复合索引的排序支持有哪些“方向性”注意点?
    复合索引的字段顺序与升 / 降序会直接决定能否利用索引完成排序;遵循 ESR 并合理设计方向以避免内存排序。(mongodb.ac.cn)
  3. 多键复合索引的限制与设计取舍?
    数组参与复合索引时会产生多键组合,可能限制排序与 $nin/ 范围组合能力;尽量让数组字段靠后或单独设计索引。(MongoDB)
  4. 部分索引 + 唯一约束有哪些边界?
    唯一性仅在满足 partialFilterExpression 的文档子集内生效;7.3 起禁止创建“等效部分索引”重复体。(MongoDB)
  5. 事务与读写关注的组合策略?
    在事务中使用 readConcern: "snapshot"writeConcern: {w:"majority"} 常见;跨分片事务开销更大,应仅在必要时启用并收敛业务范围。(mongodb.ac.cn)
  6. Change Streams 的正确使用姿势?
    限定监听范围(库 / 集合)、为 resume token 做持久化、处理分片拓扑下的事件顺序与重试,必要时配合 fullDocument 选项。(mongodb.ac.cn)
  7. WiredTiger 的持久化与崩溃恢复原理要点?
    通过 WAL(journal)+ checkpoint 协作,崩溃后先回放日志再落盘快照,保证数据一致性,同时利用压缩与缓存管理提升性能。(MongoDB)
  8. 通配符索引的性能 / 功能边界?
    适配动态字段但索引体积与维护成本可能较高;不支持 $text,需要索引 _id 时须在通配符投影中显式包含。(MongoDB)
  9. 时间序列与“桶模式(Bucket Pattern)”如何配合?
    时间序列集合底层已按时间 / 度量进行高效分组与压缩;在通用集合建模中也可用“桶模式”按时间窗口 / 范围归并,降低写放大与查询扫描。(MongoDB)
  10. 数据建模的常见反模式与规避?
    避免 无界数组 集合数量爆炸 过度嵌套 等;根据查询路径选择“嵌入 vs 引用”,必要时采用官方 模式设计模式(如 Attribute/Subset/Bucket/Outlier)。(MongoDB)

小贴士(练题建议)

  • 先做初级题巩固“索引 / 查询 / 聚合”基石,再过中级题掌握“副本集 / 分片 / 事务 / 变更流”,最后用高级题对“调优 / 建模 / 时序 / 索引细节”查缺补漏。
  • 每次写查询前先想“索引如何利用 ”“ 是否能被覆盖 ”“ 是否能按范围分页”。
  • 多用 explain() 验证你的直觉。
正文完
 0
一诺
版权声明:本站原创文章,由 一诺 于2025-10-10发表,共计4960字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码