mongodb的group操作是将某个键值作为map的分组依据,然后每个分组的数据再通过reduce函数依次处理。
其实group操作就是mapreduce的一个子集。
下面是函数原型:
group(key, condition, initial, reduce, finalize=None)
key是需要分组的键,可以是list
condition是条件,和find的一样
initial是初始的一个对象,比如你要统计每个分组的元素个数,你可以传递一个{'sum':0}
reduce是一个string,内容是js的函数,形式是:
{ 'poiName':'a', 'editStatus':'accept' } { 'poiName':'a', 'editStatus':'accept' } { 'poiName':'b', 'editStatus':'accept' } { 'poiName':'a', 'editStatus':'pending' }
func = ''' function(obj, prev) { if(obj.editStatus == 'pending') prev.pendingNum++; else if (obj.editStatus == 'discard') prev.discardNum++; else if (obj.editStatus == 'accept') prev.acceptNum++; prev.shareNum++; } ''' ret = self._collection.group(['poiName'],None,{"pendingNum":0,"discardNum":0,"acceptNum":0},func)
[{"poiName":"a","pendingNum":0,"discardNum":0,"acceptNum":2}, {"poiName":"b","pendingNum":1,"discardNum":0,"acceptNum":0}]