在 MongoDB 中,我们经常需要对数据进行聚合和统计。$group 操作符可以帮助我们实现数据分组统计,并且非常灵活。在本文中,我们将探讨一些使用 $group 操作符的技巧和注意事项。
基本语法
$group 操作符的基本语法如下:
db.collection.aggregate([ { $group: { _id: <expression>, <field1>: { <accumulator1> : <expression1> }, ... }} ])
其中,_id 表示分组依据的字段或表达式,可以是任意类型。field1 表示要输出的字段名,accumulator1 表示聚合函数,expression1 表示聚合函数的输入表达式。
使用 $sum 统计数据总和
$sum 是 $group 操作符中最常用的聚合函数之一,可以用来统计数据总和。例如,我们有一个学生成绩的集合,包含姓名和分数两个字段:
{ "name": "小明", "score": 80 } { "name": "小红", "score": 90 } { "name": "小刚", "score": 70 } { "name": "小华", "score": 85 }
现在我们想要计算所有学生的总分,可以使用以下代码:
db.students.aggregate([ { $group: { _id: null, total: { $sum: "$score" } }} ]) // 输出结果:{ "_id" : null, "total" : 325 }
上面的代码中,我们将 _id 设置为 null,表示不对任何字段进行分组,直接对所有数据进行统计。然后使用 $sum 统计每个文档的 score 字段,并输出总和到 total 字段。
分组计数
除了统计总和,我们还可以使用 $group 操作符统计分组数量。例如,在上面的例子中,我们可以统计学生的数目:
db.students.aggregate([ { $group: { _id: null, count: { $sum: 1 } }} ]) // 输出结果:{ "_id" : null, "count" : 4 }
这里的 $sum 输入是一个常数 1,表示统计数量而不是求和。
分组排序
使用 $group 操作符可以按照指定字段进行分组排序,例如:
db.students.aggregate([ { $group: { _id: "$score", count: { $sum: 1 } }}, { $sort: { _id: -1 } } ])
上面的代码按照分数进行分组,然后统计每个分数出现的次数,最后按照分数倒序排序。输出结果如下:
{ "_id" : 90, "count" : 1 } { "_id" : 85, "count" : 1 } { "_id" : 80, "count" : 1 } { "_id" : 70, "count" : 1 }
注意,$sort 操作符必须在 $group 操作符之后使用,否则会抛出错误。
多字段分组计数
除了单个字段分组统计,$group 还支持使用多个字段进行分组计数。例如,我们有一个员工的工资表,其中包括部门、职位和薪水三个字段:
{ "dept": "HR", "title": "Manager", "salary": 8000 } { "dept": "HR", "title": "Clerk", "salary": 4000 } { "dept": "IT", "title": "Manager", "salary": 12000 } { "dept": "IT", "title": "Developer", "salary": 8000 }
现在我们想要按照部门和职位计算每个职位在每个部门有多少员工,可以使用以下代码:
-- -------------------- ---- ------- ------------------------ - ------- - ---- - ----- -------- ------ -------- -- ------ - ----- - - --- - ------ - ----------- -- ------------ - - - -- -- ----- -- - ----- - - ------ - ----- ------- - ------- -- ------- - - - -- - ----- - - ------ - ----- ------- - --------- -- ------- - - - -- - ----- - - ------ - ----- ------- - ----------- -- ------- - - - -- - ----- - - ------ - ----- ------- - --------- -- ------- - - -
上面的代码中,我们将 _id 设置为一个包含部门和职位的对象,表示按照这两个字段进行分组。然后使用 $sum 统计每个组的数量,并按照部门和职位进行升序排序。
总结
$group 操作符是 MongoDB 中非常强大的聚合函数之一,可以用于统计和分组计数等操作。需要注意的是,$group 操作符必须放在 $match、$project 和 $sort 等操作之后进行使用。同时,使用 $group 操作符时需要注意对 _id 字段的设置和使用各种聚合函数的输入表达式。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/651f6a6495b1f8cacd6f9d79