为什么选择 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