Mongodb的mapreduce如何實作只更新現有表的部分字段,而不是整個文檔
给我你的怀抱
给我你的怀抱 2017-04-24 15:59:55
0
1
623

MapRedue 的輸出

{"out", option }

option可以是下面幾個選項:

  • "collection name" – mapReduce的輸出結果會取代原來的collection,collection不存在則建立
  • { replace : "collection name" } – 同上
  • { merge : "collection name" } – 將新舊資料合併,新的替換舊的,沒有的加入進去
  • { reduce : "collection name" } – 存在舊資料時,在原來基礎上加新資料(即 new value = old value + mapReduce value)
  • { inline : 1 } – 不會建立collection,結果保存在記憶體裡,只限於結果小於16MB的情況
    如果用collection name作option不能與其它option一起使用,其它則可以,如:

    • { "out", { replace : "collection name", db : "db name" } }

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

给我你的怀抱
给我你的怀抱

全部回覆(1)
小葫芦

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.

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板