mongodb的group跟其他sql的group一样,对数据表进行分组计算;它使用JavaScript,在性能上受到一些限制。大多数情况下,$ group在Aggregation Pipeline提供了一种具有较少的限制适用的替代。可以通过指定的键的集合中的文档和执行简单的聚合函数。在2.2版本中,返回的数组可以包含最多20000个元素;即最多20000个独特的分组。
缺点:group和distinct一个限制不能返回超过16M的数据;
优点:通常情况下,处理数据比map_reduce快;
例子:
db.TotalUserAverageDailyLengthRound_temp.group(
{key: {"day_time": true,"discount": true}, //group 分组key值
//keyf等价于key
// keyf: function (doc){return {'month':doc.day_time,discount:doc.discount};},
initial:{countUser:0,totalDuration:0},//初始化文档变量
reduce:function(doc,aggregator){//数据处理结果方法体
aggregator.countUser+=1;
aggregator.totalDuration+=doc.duration;
},
finalize:function(doc){ //终结器
doc.totalDuration=doc.totalDuration/1000;
}});
各参数列表说明:
名称 | 描述 |
key | 作为分组的key,等价于sql中group by a,b |
initial | 初始化聚合结果文档变量,为空时自动为每列提供初始变量。 |
reduce | 一个聚合函数操作文档的分组操作期间。这些函数可以返回一个sum或count。该函数接受两个参数:当前文档和这个群体聚集的结果文档 |
keyf | 可选。替代的key 字段。指定一个函数创建一个“key object”作为分组的key。使用keyf而是通过group by领域而不是现有的文档域键组。 |
cond | 过滤条件 |
finalize | 在db.collection.group()返回最终结果之前,此功能可以修改的结果文档或替换的结果文档作为一个整体。 |