MongoDB map/reduce 计数

3
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个回答

3

Map/Reduce模式类似于SQL中的分组函数。因此,一些结果被分组在一行中,所以你不能有相同数量的结果。

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

例如:你有两行:

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

而且您应用了map函数

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

我知道什么是Map/Reduce。正如我所说,“counts”不是一个数字,而是一个字典,其中包含一个名为“input”的成员。根据MongoDB文档,这是“扫描的对象数量”。现在我的问题是 - 这是否等于满足条件的对象的数量,或者还有其他事情需要考虑?如果我的问题不够清晰,请重新阅读并让我知道如何改进它。 :) - ibz

0

你的服务器在这两个调用之间是稳定状态吗?


是的。 :) 而且我得到的两个数字非常不同,看起来不会是相同的查询... - ibz
听起来可能是个问题,你能否将你的测试用例发送到Google Groups上的mongodb-user邮箱? - mdirolf
我当时时间紧迫,只是在做一些报告,所以代码质量并不是一个问题,所以我只是用Python模拟了map/reduce(结果非常快且准确)。后来我发现数据库实际上已经损坏了(可能是由于多次杀死服务器造成的),这可能解释了奇怪的行为。不过我想我再也无法重现它了。还是谢谢你。 :) - ibz
这是我在SO上看到的最短的答案 :O - Carmoreno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接