MongoDB查询语言精讲:聚合管道与分组统计
(4) feilong.org 修订于2026-08-17 08:45:49 MongoDB教程什么是MongoDB聚合框架?
MongoDB的聚合框架是一种强大的数据处理工具,允许开发者通过管道阶段对集合中的文档进行转换、过滤和汇总。其核心概念基于“管道”(Pipeline)模型,每个阶段执行特定操作并传递结果到下一阶段。
聚合框架的核心组件包括:
- $match:筛选符合条件的文档
- $group:按指定字段分组并计算统计值
- $sort:对输出结果排序
- $project:重塑文档结构
- $lookup:执行跨集合连接
聚合管道详解
聚合操作以管道形式组织,每个阶段通过操作符定义。以下是一个典型示例:
|
1 2 3 4 5 6 7 8 9 |
db.sales.aggregate([ { $match: { date: { $gte: new Date("2023-01-01"), $lte: new Date("2023-12-31") } } }, { $group: { _id: "$region", totalSales: { $sum: "$amount" }, avgSale: { $avg: "$amount" } }}, { $sort: { totalSales: -1 } } ]) |
管道阶段解析
1. $match:过滤2023年所有销售记录,减少后续处理数据量。
2. $group:按region字段分组,计算每个区域的总销售额和平均值。
- _id字段定义分组键(可为表达式或嵌套对象)
-
|
1 |
$sum |
、
|
1 |
$avg |
等累加器用于统计计算
3. $sort:按总销售额降序排列结果
分组统计实战技巧
1. 多条件分组
通过组合字段实现多维分组:
|
1 2 3 4 5 6 7 8 9 |
{ $group: { _id: { year: { $year: "$date" }, region: "$region" }, count: { $sum: 1 } } } |
2. 分组后筛选
使用
|
1 |
$match |
阶段过滤分组结果:
|
1 2 3 4 |
[ { $group: { _id: "$category", total: { $sum: "$price" } } }, { $match: { total: { $gt: 10000 } } } ] |
3. 嵌套分组
通过多层
|
1 |
$group |
实现复杂统计:
|
1 2 3 4 5 |
[ { $group: { _id: "$region", sales: { $push: "$amount" } } }, { $unwind: "$sales" }, { $group: { _id: "$_id", avg: { $avg: "$sales" } } } ] |
性能优化建议
1. 尽早过滤:在管道前端使用
|
1 |
$match |
减少数据量,避免后续阶段处理冗余数据。
2. 索引利用:对
|
1 |
$match |
中使用的字段创建复合索引(如
|
1 |
{date: 1, region: 1} |
)。
3. 限制输出:通过
|
1 |
$limit |
或
|
1 |
$skip |
控制结果集大小,避免内存溢出。
常见问题与解决方案
Q1:如何统计每个用户的订单数量?
|
1 2 3 |
db.orders.aggregate([ { $group: { _id: "$userId", count: { $sum: 1 } } } ]) |
Q2:如何计算分组后的最大值和最小值?
|
1 2 3 4 5 6 7 |
{ $group: { _id: "$region", maxSale: { $max: "$amount" }, minSale: { $min: "$amount" } } } |
结语
MongoDB的聚合框架通过管道模型实现了灵活的数据处理能力。掌握
|
1 |
$group |
等核心操作符,结合分组统计技巧,能够高效完成复杂数据分析任务。在实际开发中,建议根据数据规模和业务需求合理设计管道结构,并充分利用索引优化性能。
更新网址:https://feilong.org/mongodb-aggregation-grouping
最初发布:20260817 08:45:49 feilong.org 于广州
加入收藏夹,查看更方便。