请通过浏览器功能收藏网页

mongoDB中的 group 命令详解 mongodb

发布时间:2018-09-10 11:22:27  作者:本站编辑  来源:本站原创  浏览次数:
我有话说 | 分享 |
www.javainfo.com.cn 上干货 欢迎收藏


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

    开心

  • 0

    板砖

  • 0

    感动

  • 0

    有用

  • 0

    疑问

  • 0

    难过

  • 0

    无聊

  • 0

    震惊

评论已有 0