在大数据时代,无论是前端开发还是后端开发都需要处理海量数据。而在数据处理中,数据的分组、统计是必备的基础技能之一。在 MongoDB 中,我们可以使用 $group 对数据进行分组统计。
$group 简介
$group 用于对数据集合中的文档进行分组计算,可以根据一个或多个字段进行分组,对每个组进行某些操作,如求和、求平均值、计数、求最大值或最小值等。
$group 的语法
$group 的基本语法如下:
{$group: {_id: <expression>, <field1>: {<accumulator1>: <expression1>}, …,<fieldN>: {<accumulatorN>: <expressionN>}}}
其中,
_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