2013-04-27 64 views
0

我測試的MapReduce功能,但我有意外的行爲:用MongoDB的MapReduce的意外行爲

我填充我收藏的這個簡單的循環:

for (i=0; i<10000; i++) {db.coll.insert({'a':1,'b':2})} 

所以我想指望用相同的文件'A' 值(這是一個測試:-)) 我的地圖功能是

map = "function() { emit(this.a,this.b);}" 

,並減少是:

reduce = "function (key,values) {return values.length;}" 

調用 db.coll.mapReduce(地圖,減少{出來:{在線:1}})

的預期值是10000個文檔使用相同的 'A',它的確定?

但結果是:

db.coll.mapReduce(map, reduce, {out:{inline:1}}) 
{ 
    "results" : [ 
      { 
        "_id" : 1, 
        "value" : 101 
      } 
    ], 
    "timeMillis" : 892, 
    "counts" : { 
      "input" : 10000, 
      "emit" : 10000, 
      "reduce" : 100, 
      "output" : 1 
    }, 
    "ok" : 1, 
} 

問題出在哪裏???爲什麼價值是101?減少計數結果的含義是什麼? 幫幫我!提前致謝!!!

回答

0

這個結果是非常值得期待的,因爲你的reduce函數實際上並沒有做任何的減少。

看看一些基本的map-reduce示例HERE,看看reduce函數實際上在做什麼。它以某種方式組合每個唯一密鑰的值。你的減少功能不是那麼做的。

+0

它可能並不明顯,爲什麼你得到了101,但它實際上是相當可預測的,因爲reduce函數並不是只針對每個具有大量所有值的鍵調用一次,而是將值分組,然後reduce可以稱爲多個次數用新的數組值重新減少已經減少的值 - 批次爲100將導致最後一次調用時值數組的長度爲101。 – 2013-04-28 00:27:29