Develop

MongoDB 实战:从 CRUD 到聚合管道的进阶之路

✎ -- 字 🕐 -- 分钟
字号

为什么选择 MongoDB

MongoDB 是目前最流行的 NoSQL 文档数据库,其 Schema-less 特性让它在快速迭代和微服务架构中表现出色。与 MySQL 不同,MongoDB 天然支持嵌套文档和数组,能更自然地表达复杂业务对象。

Schema 设计核心原则

虽然 MongoDB 不需要预定义 Schema,但好的数据建模仍然至关重要:

  • 嵌入 vs 引用:高频一起读取的数据应嵌入(embed),独立实体应引用(reference)
  • 一对多关系:少量关联用嵌入数组,大量关联用引用+$lookup
  • 读写比例:读多写少的场景优先优化查询性能
// 嵌入式设计示例 - 博客文章+评论
{
  "_id": ObjectId("..."),
  "title": "MongoDB 实战指南",
  "comments": [
    { "user": "alice", "text": "写得好", "date": ISODate("2024-01-15") },
    { "user": "bob", "text": "很实用", "date": ISODate("2024-01-16") }
  ]
}

索引策略

MongoDB 支持丰富的索引类型:单字段、复合、多键、文本、地理空间。关键原则:

  • 使用 explain() 分析查询性能
  • 复合索引遵循 ESR 规则(Equality, Sort, Range)
  • 利用覆盖索引避免回表查询
// 创建复合索引
db.orders.createIndex({ status: 1, createdAt: -1, userId: 1 })

// 分析查询
db.orders.find({ status: "completed" })
  .sort({ createdAt: -1 })
  .explain("executionStats")

聚合管道实战

聚合管道是 MongoDB 最强大的功能之一,支持类似 SQL GROUP BY + JOIN 的复杂数据处理:

db.orders.aggregate([
  { $match: { status: "completed" } },
  { $group: { _id: "$productId", total: { $sum: "$amount" }, count: { $sum: 1 } } },
  { $sort: { total: -1 } },
  { $limit: 10 }
])

生产部署要点

  • 副本集(Replica Set)保证高可用,至少3节点
  • 分片(Sharding)应对海量数据,按 shard key 分布
  • 启用 WiredTiger 存储引擎的压缩功能
  • 配置合理的 write concern 和 read preference