MongoDB 简明教程

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 是一个“阻塞”阶段,这意味着在处理数据之前,它需要等待前一阶段的所有输入数据全部到位。在处理超大规模数据集时,请务必关注内存限制。