option可以是下面幾個選項:
{ inline : 1 } – 不會建立collection,結果保存在記憶體裡,只限於結果小於16MB的情況
如果用collection name作option不能與其它option一起使用,其它則可以,如:
merge選項的可能性最大,但是經過實驗發現,它總是會根據「_id」更新整個文檔,而不是只更新reduce或finalize出來的物件裡有的欄位。
例如我一個已經存在的集合A,有10幾個字段,沒有emps字段,我運行一個MR操作,reduce出來的是{key,emps:[["0132",70],["1443",30 ]]},想把emps欄位加入到現有的集合A上,結果我10幾個欄位都沒有了,就只剩下emps欄位了。
本來想在reduce裡引用db物件手工update的,但現在的版本都不讓引用db物件了。
現在只能在mapreduce後,執行一個forEach,手動執行update。
請問mapreduce有沒有對應的解決方案。
用
reduce
,他會把你在結果集中 已經存在的結果 和 新計算出來的結果 用你提供的 reduce function (reducer) 算一遍,把最後結果存下來。這裡最重要的讓 mapper 輸出的中間結果跟最終結果有相同的格式。這樣一個reducer用在兩個地方,一次在 reduce 中,一次在輸出中,如果他們有相同的格式,尤其是層次,就容易寫好多。可以把 reducer 理解成只負責合併多個結果,如果 mapper 只輸出一個中間結果,它就應該可以不經過reducer,直接作為最終結果。事實上,MongoDB中,當一個key只對應一個mapper輸出的時候,的確是不經過reducer的直接輸出的。http://docs.mongodb.org/manual/reference/method/db.collection.mapReduce/#output-to-a-collection-with-an-action