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"}} 保证多数节点确认。