Week 2 · Chapter 3 · MongoDB 核心

复习难度:⭐⭐ | 预计时长:2-3小时 | 重点程度:中


核心优势 vs MySQL

MongoDB MySQL
数据模型 文档(JSON) 关系型(行+列)
事务 4.0+支持副本集内事务 原生支持
扩展性 Sharding 原生支持 分库分表中间件
写入速度 快(默认不等待确认)
查询灵活性 高(动态schema) 中(固定schema)

聚合管道(核心)

// 你简历里用过 iSESOL 平台,数据接入场景用得上
// 示例:统计每个设备最近1小时的报文数量
db.device_messages.aggregate([
  { $match: { timestamp: { $gte: ISODate("2026-04-12T00:00:00Z") } } },
  { $group: { _id: "$device_id", count: { $sum: 1 }, avg_value: { $avg: "$value" } } },
  { $sort: { count: -1 } },
  { $limit: 10 }
])

索引

// 单字段索引
db.users.createIndex({ "name": 1 })

// 复合索引(注意顺序:等值查询字段在前,排序字段在后)
db.orders.createIndex({ "user_id": 1, "created_at": -1 })

// 多键索引(数组字段)
db.tags.createIndex({ "tags": 1 })

// 覆盖索引:查询字段全在索引中,不需要回表

分片(Sharding)

Shard Key 选择原则:
  - 查询频率高的字段
  - 避免单调递增/递减(热点问题)
  - 基数足够大

分片策略:
  - 范围分片:容易产生热点
  - 哈希分片:分布均匀,适合随机访问

面试重点

Q:MongoDB 什么时候用?

① 数据结构灵活(schema变化频繁) ② 需要快速迭代的业务(创业公司) ③ 日志/IoT等半结构化数据 ④ 需要水平扩展的场景

Q:MongoDB 的事务和 MySQL 有什么区别?

MySQL 跨库事务需要 XA;MongoDB 4.0+ 副本集内事务是单节点的 MVCC,只有在分片集群才是两阶段提交。

Q:MongoDB 会丢数据吗?

默认写入策略 w=1(只写到内存,不等磁盘),可以通过 {writeConcern: {w: "majority"}} 保证多数节点确认。