MongoDB 聚合管道实战:数据转换与分析的高效利器
MongoDB 不仅仅是简单的文档存储——它的聚合管道相当于关系数据库的 GROUP BY + JOIN + 窗口函数的合体。
管道核心阶段
| 阶段 | 作用 | 类比 SQL |
|---|---|---|
| $match | 过滤文档 | WHERE |
| $group | 分组聚合 | GROUP BY |
| $sort | 排序 | ORDER BY |
| $project | 字段筛选计算 | SELECT |
| $limit/$skip | 限制/跳过 | LIMIT/OFFSET |
| $lookup | 联表查询 | LEFT JOIN |
| $unwind | 数组展开为多行 | 无直接类比 |
| $addFields | 新增计算字段 | 计算列 |
管道顺序很重要:$match 尽量放前面(尽早减少数据量)、$lookup 放 $match 之后、$project 放最后做数据整形。
$lookup:MongoDB 的 JOIN
$lookup 支持管道子表达式——可以在 lookup 内部先过滤再关联,比 SQL 的 JOIN + WHERE 更灵活。但大表关联时性能较差,频繁关联场景考虑内嵌文档或预聚合。
$unwind:拆解数组
文档中的数组字段用 $unwind 展开——每展开一个数组元素就产生一行新文档。配合 $group 可以做按数组元素的统计。例如订单中的商品列表展开后统计每个商品的销量。
窗口函数:$setWindowFields
MongoDB 5.0+ 支持窗口函数,可以做移动平均、排名、累计求和等操作。不需要再把数据拉到应用层计算——直接在数据库里一步完成。
性能优化
$match 和 $sort 可以利用索引,其他阶段不走索引。对于超大集合,使用 allowDiskUse 允许管道使用磁盘临时存储(超过 100MB 内存限制时必需)。
总结
聚合管道是 MongoDB 最被低估的能力。一条管道替代了 SQL 多条语句 + 应用层处理。理解 $match/$group/$lookup/$unwind 这四个核心阶段,就能用 MongoDB 做实时数据分析。
本文是原创文章,采用CC BY-NC-SA 4.0协议,完整转载请注明来自CC 的技术工坊
