MongoDB 中使用 $group 进行分组统计技巧分享

在大数据时代,无论是前端开发还是后端开发都需要处理海量数据。而在数据处理中,数据的分组、统计是必备的基础技能之一。在 MongoDB 中,我们可以使用 $group 对数据进行分组统计。

$group 简介

$group 用于对数据集合中的文档进行分组计算,可以根据一个或多个字段进行分组,对每个组进行某些操作,如求和、求平均值、计数、求最大值或最小值等。

$group 的语法

$group 的基本语法如下:

其中,

  • _id:表示分组的依据,可以是一个常量、表达式、变量等。
  • <field1><fieldN>:表示分组后添加的新字段。
  • <accumulator1><accumulatorN>:表示用于对分组后的数据进行聚合操作的一组统计函数,可选的有 $addToSet$avg$first$last$max$min$sum 等。

$group 的示例

假设有一个文档集合,里面存储了学生的成绩信息,包括学生姓名、学科名和分数,如下所示:

[
  { name: '小明', subject: '语文', score: 90 },
  { name: '小明', subject: '数学', score: 80 },
  { name: '小红', subject: '语文', score: 95 },
  { name: '小红', subject: '数学', score: 85 }
]

我们可以使用 $group 进行分组统计,获取每个学生的总分和平均分,示例代码如下:

db.scores.aggregate([
  {$group:
    {
      _id: "$name",
      totalScore: {$sum: "$score"},
      avgScore: {$avg: "$score"}
    }
  }
])

分析代码,我们首先对 scores 集合进行聚合操作,使用 $group 对每个学生进行分组。在分组中,使用 $name 作为分组依据,表示按照学生姓名进行分组。然后,在 $group 中,使用 $sum 对分组后的分数进行求和,计算总分,并使用 $avg 对分数进行求平均值,计算平均分。最后得到的结果如下所示:

[
  { _id: '小明', totalScore: 170, avgScore: 85 },
  { _id: '小红', totalScore: 180, avgScore: 90 }
]

$group 的进阶应用

除了基本的分组统计之外,$group 还可以结合其他操作符实现更多高级的应用。

$project

$project 用于对真实字段进行重命名、选择、新增字段等操作。它可以在 $group 前使用,将需要的字段事先筛选出来,减少后续处理的数据量。

db.scores.aggregate([
  {$project: {name: 1, score: 1}},
  {$group: {_id: "$name", totalScore: {$sum: "$score"}}}
])

该示例中,我们首先使用 $project 选择了 name 和 score 两个字段,并将它们传递给管道的下一阶段 $group。这样在 $group 阶段中,MongoDB 只需保留需要的数据,显著提高聚合操作的效率。

$match

$match 可以在 $group 前使用,用于筛选符合某些条件的文档,进一步减少处理数据的数量。

db.scores.aggregate([
  {$match: {subject: '数学'}},
  {$group:
    {
      _id: "$name",
      totalScore: {$sum: "$score"}
    }
  }
])

该示例中,我们首先使用 $match 筛选出学科为数学的文档,然后再使用 $group 进行分组统计,得到每个学生在数学学科的总分。

$sort

$sort 用于对分组后的文档进行排序。

db.scores.aggregate([
  {$group: {_id: "$name", totalScore: {$sum: "$score"}}},
  {$sort: {totalScore: -1}}
])

该示例中,我们首先使用 $group 进行分组统计,得到每个学生的总分。然后,使用 $sort 对总分进行降序排序,得到每个学生的排名。

总结

以上便是 $group 在 MongoDB 中的基本使用方法。通过合理地使用 $group,$project, $match 和 $sort 等操作符,我们可以针对性地筛选、聚合操作,打造高效的数据分析系统,并且使得分析结果更加准确、精细化。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a4de9eadd4f0e0ffd383f5


纠错反馈