2012-07-05 82 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