Python MapReduce结果似乎仅限于100?

Python MapReduce结果似乎仅限于100?,python,mongodb,mapreduce,pymongo,Python,Mongodb,Mapreduce,Pymongo,我在MongoDB和python中使用Map Reduce,遇到了一个奇怪的限制。我只是想数一数“书本”记录的数量。当记录少于100条时,它工作,但当超过100条时,由于某种原因,计数会重置 以下是我的MR代码和一些示例输出: var M = function () { book = this.book; emit(book, {count : 1}); } var R = function (key, values) { var sum = 0; values.forEach(functio

我在MongoDB和python中使用Map Reduce,遇到了一个奇怪的限制。我只是想数一数“书本”记录的数量。当记录少于100条时,它工作,但当超过100条时,由于某种原因,计数会重置

以下是我的MR代码和一些示例输出:

var M = function () {
book = this.book;
emit(book, {count : 1});
}

var R = function (key, values) {
var sum = 0;
values.forEach(function(x) {
sum += 1;
});
var result = {
count : sum 
};
return result;
}
记录计数为99时的MR输出:

{u'_id': u'superiors', u'value': {u'count': 99}}
记录计数为101时的MR输出:

{u'_id': u'superiors', u'value': {u'count': 2.0}}

有什么想法吗?

您的
reduce
函数应该将
计数
值相加,而不仅仅是为每个值添加
1
。否则,
reduce
的输出不能正确地用作另一个
reduce
的输入。请尝试以下方法:

var R = function (key, values) {
  var sum = 0;
  values.forEach(function(x) {
    sum += x.count;
  });
  var result = {
    count : sum 
  };
  return result;
}

如果发射数等于或大于100,将首先发送100个发射以减少功能并处理:

{count:100}

然后只剩下1个发射,发送到reduce函数和进程:

{count:1}

好的,现在的结果是:

[{count:100},{count:1}]

然后,这将再次调用reduce函数(非常重要!)。因为在您的代码中,
foreach sum+=1
。数组中有两个元素,因此结果是
2

参考: