MongoDB映射/减少计数

时间:2010-05-26 07:52:56

标签: mongodb mapreduce

MongoDB的map / reduce的输出包括'counts': {'input': I, 'emit': E, 'output': O}之类的内容。我以为我清楚地明白了那些意思,直到我遇到一个我无法解释的奇怪案例。

根据我的理解,counts.input是与条件匹配的行数(在query中指定)。如果是这样,以下两个查询如何可能有不同的结果?

db.mycollection.find({MY_CONDITION}).count()

db.mycollection.mapReduce(SOME_MAP, SOME_REDUCE, {'query': {MY_CONDITION}}).counts.input

我认为只要使用相同的条件,两者应该总是给出相同的结果,独立于map和reduce函数。

2 个答案:

答案 0 :(得分:3)

map / reduce模式就像SQL中的组函数。因此,在一行中对某些结果进行分组。所以你的结果不能相同。

mapReduce()方法中的计数是map / reduce函数之后的结果数。

以身作则。你有两行:

{'id':3,'num':5}
{'id':4,'num':5}

并应用地图功能

function(){
  emit(this.num, 1);
}

在此地图功能之后,您将获得2行:

{5, 1}
{5, 1}

现在你应用你的reduce方法:

function(k,vals) {
     var sum=0;
     for(var i in vals) sum += vals[i];
     return sum;
}

现在只有1行返回:

2

答案 1 :(得分:0)

您的服务器在两次通话之间是否处于稳定状态?