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}]