首頁  >  問答  >  主體

Mongodb的mapreduce如何實作只更新現有表的部分字段,而不是整個文檔

MapRedue 的輸出

{"out", 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有沒有對應的解決方案。

给我你的怀抱给我你的怀抱2759 天前609

全部回覆(1)我來回復

  • 高洛峰

    高洛峰2017-04-24 16:01:55

    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

    Merge the new result with the existing result if the output collection already exists. If an existing document has the same key as the new result, apply the reduce function to both the new and the exed result, apply the reduce function to both the new and the exed the newceal.

    回覆
    0
  • 取消回覆