MongoDB入土笔记

71次阅读
没有评论

共计 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)

十、加分:几道易踩坑的“更正题”

  1. “MongoDB 不支持跨分片事务”——错误:4.2 起已支持分布式事务。(MongoDB)
  2. “更新会立刻 fsync 到磁盘”——不准确:耐久性由 writeConcern/journal 决定;journal 组提交约 100ms,checkpoint 约 60s。(MongoDB)
  3. “默认 chunk 64MB”——已变更:当前默认 128MB。(MongoDB)
  4. “remove()/update() 万能”——旧写法 :推荐 deleteOne/deleteManyupdateOne/updateMany,并支持 管道式更新。(MongoDB)
正文完
 0
一诺
版权声明:本站原创文章,由 一诺 于2025-10-09发表,共计3208字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码