mongodb的group操作是将某个键值作为map的分组依据,然后每个分组的数据再通过reduce函数依次处理。
其实group操作就是mapreduce的一个子集。
下面是函数原型:
group(key, condition, initial, reduce, finalize=None)
key是需要分组的键,可以是list
condition是条件,和find的一样
initial是初始的一个对象,比如你要统计每个分组的元素个数,你可以传递一个{'sum':0}
reduce是一个string,内容是js的函数,形式是:
function(obj, prev)
group先按照key进行分组,然后每个分组,对分组内的元素依次调用reduce函数,
obj是当前元素,prev是上一个元素处理过的初始化的那个对象。
第一个元素接受到的obj就是initial的,然后第二个元素接收到的第一个元素处理过之后的。
下面是一个例子:
数据集合是:
{
'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}]