mongoDB中的 group 命令详解 mongodb
group命令用来对集合进行分组,分组过后,再对每一个分组内的文档进行聚合。
比如要对studentId进行分组,找到每个学生最高的分数,可以如下步骤进行:
1:测试数据就用聚合框架一开始准备的数据
2:使用group,示例如下:
db.runCommand({"group":{
"ns":"scores", -- ns:指定要分组的集合
"key":{"studentId":1},-- key:指定分组的键
"initial":{"score":0}, --initial:每一组的reduce函数调用的时候,在开头的时候调用一次,以做初始化
"$reduce":function(doc,prev){
-- $reduce:在每组中的每个文档上执行,系统会自动传入两个参数,doc是当前处理的文档,prev是本组前一次执行的结果文档
if(doc.score > prev.score){
prev.score = doc.score;
}
}
}});
3:你还可以在group的时候添加条件,就是加入condition:
"condition":{"studentId":{"$lt":"s2"}}
4:同样可以使用finalizer来对reduce的结果进行最后的处理,比如要求每个学生的平均分,就可以先按照studentId分组,求出一个总的分数来,然后在finalizer里面,求平均分:
db.runCommand({"group":{
"ns":"scores",
"key":{"studentId":1},
"initial":{"total":0},
"$reduce":function(doc,prev){
prev.total += doc.score;
},
"condition":{"studentId":{"$lt":"s2"}},
"finalize":function(prev){
prev.avg = prev.total/3;
}
}});
注意:finalize是只在每组结果返回给用户前调用一次,也就是每组结果只调用一次
5:对于分组的key较为复杂的时候,还可以采用函数来做为键,比如让键不区分大小写
db.runCommand({"group":{
"ns":"scores",
$keyf:function(doc){ 函数KEY值
return {studentId:doc.studentId.toLowerCase()}; 转化为小写
},
"initial":{"total":0},
"$reduce":function(doc,prev){
prev.total += doc.score;
},
"condition":{"$or":[{"studentId":{"$lt":"s2"}},{"studentId":"S0"}]},
"finalize":function(prev){
prev.avg = prev.total/3;
}
}
});
注意:要使用$keyf来定义函数作为键,另外一定要返回对象的格式
如有疑问 请留言 欢迎提供建议











评论已有 0 条