MongoDB $group
1. $group 阶段简介
$group 阶段通过指定的表达式将文档进行分组,并为每个唯一的组合输出一个文档。你可以利用此阶段对数据进行统计、求和、计算平均值等汇总操作。
2. 强制性的 _id 字段
在 $group 阶段中,_id 字段是必须指定的。它用于定义分组的“键”(Group Key)。
- 如果你想根据某个特定字段进行分组,可以将该字段的名称(需加 $ 前缀)赋值给 _id。
- 如果你想对所有输入文档进行全局汇总(不分小组),可以将 _id 设置为 null 或任何常量。
3. 累加器操作符 (Accumulator Operators)
累加器用于对每个分组内的文档执行特定的计算。常见的累加器包括:
| 操作符 | 描述 |
|---|---|
| $sum | 计算数值的总和(忽略非数值)。 |
| $avg | 计算数值的平均值。 |
| $min | 获取组内的最小值。 |
| $max | 获取组内的最大值。 |
| $push | 将组内的值添加到数组中。 |
| $addToSet | 将组内的唯一值添加到数组中。 |
4. 实践示例
4.1 按字段分组
假设你想统计每个类别(category)下的总点赞数(likes),你可以按如下方式操作:
示例
db.posts.aggregate([
{
$group: {
_id: "$category",
totalLikes: { $sum: "$likes" }
}
}
])在这个例子中,_id 被设置为 $category,这意味着 MongoDB 会根据 category 字段的不同取值将文档分类。
4.2 全局聚合 (Group by Null)
如果你想计算所有文档的总点赞数,而不按类别拆分,可以将 _id 设置为 null。
示例
db.posts.aggregate([
{
$group: {
_id: null,
totalLikes: { $sum: "$likes" }
}
}
])切记:$group 是一个“阻塞”阶段,这意味着在处理数据之前,它需要等待前一阶段的所有输入数据全部到位。在处理超大规模数据集时,请务必关注内存限制。