2012-07-05 78 views
0

我正在使用MongoDB并希望计算集合中每个不同“concatenated_handles”(字符串类型为字段)的出现次数。MongoDB MapReduce返回意外的结果并分组两次

我还排序按出现次数过,所以我决定用MapReduce的,一切都准备好,但我突然开始变得不可预料的结果,我改变任何代码任何

这是我的地图:

function() { emit(this.concatenated_handles, { count: 1}); } 

这是减少:

r = function(key, values) { var result = {count : 0}; values.forEach(function(value) { result.count++; }); return result; } 

其返回正确值的某些字段,不正确的人一段时间。我记录的输出,并且这(只显示其窃听场)

msdhoni#yuvstrong12:0 
    msdhoni#yuvstrong12:1 
    msdhoni#yuvstrong12:2 
    .... 
    ... 
    msdhoni#yuvstrong12:255 
    msdhoni#yuvstrong12:256 
    musclenerd#pod2g:0 
    musclenerd#pod2g:1 

该字段从其他几个行后再次分组(全部重新分组是接近年底)

justinbieber#pattiemallette:0 
justinbieber#pattiemallette:1 
justinbieber#pattiemallette:2 
justinbieber#pattiemallette:3 
justinbieber#scooterbraun:0 
justinbieber#scooterbraun:1 
justinbieber#scooterbraun:2 
kaleycuoco#kunalnayyar:0 
kaleycuoco#kunalnayyar:1 
kaleycuoco#kunalnayyar:2 
kaleycuoco#kunalnayyar:3 
kaleycuoco#kunalnayyar:4 
kaleycuoco#kunalnayyar:5 
msdhoni#yuvstrong12:0 
msdhoni#yuvstrong12:1 
msdhoni#yuvstrong12:2 

上述所有字段都已重新注册。他们似乎是相同的,但他们分组了两次,因此意想不到的结果。所有记录都不会发生这种情况。

我哪里错了?组字段是一个字符串。

谢谢!

回答

0

好的,MongoDB可以递归或部分调用MapReduce。所以,reduce函数应该是幂等的。

你会说我的reduce函数也是幂等的,因为值映射的结构正在发射,并且值减少的结构返回的结果是一样的。但是,需要注意的一点非常重要 - 每次调用都是以迭代方式进行时,第一个调用的结果将作为第二个调用的输入传递。

所以在我的情况下,这种减少:

r = function(key, values) { var result = {count : 0}; values.forEach(function(value) { result.count++; }); return result; } 

每个后续的调用为相同的密钥将与0开始的增量加1,而不是添加传递给它从以前的迭代作为计数的value.count

因此而不是做

result.count++; 

我应该做的事情

result.count += value.count; 

这样每个呼叫都会使用计数直到前一个呼叫。

我不知道如果我正确地解释这一点,但它也记录在这里(下更多的技术说明):

http://www.mongodb.org/display/DOCS/MapReduce