MongoDB的MapReduce相當于Mysql中的group
使用MapReduce要實作兩個函數 Map Function 和 Reduce Function
在調用mapReduce時需要用到這兩個函數
?
1 | |
Map Function 調用emit(key, value),周遊collection中所有的記錄,将key與value傳遞給Reduce Function進行處理
collection things中有如下記錄
?
1 2 3 4 5 | |
Map Function
?
1 2 3 4 5 | |
m函數掃描每條記錄的tags,将tags的每個元素如:“dog",“cat”……作為key,{count : 1}作為value,如:{"dog", { count : 1}},{"cat", { count : 1}},将這些{ key : value}(注: 經過聚集的)傳遞給Reduce Function
?
1 2 3 4 5 6 | |
r函數統計每個tag的個數,r的傳回結果要與emit函數的value格式一緻(官方文檔說如果不一緻的話,bug很難調試) 。r函數調用的方式如下:
?
1 2 3 | |
執行mapReduce()
?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 | |
在文檔中output選項是可選的,但在操作過程中發現,沒有{out : {replace : 'things_reduce'}}會報錯。
db.collection.mapReduce(mapfunction,reducefunction[,options]);
輸出選項結構如下:
{ "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" } }
PS: 還有哪些選項,不清楚,沒在文檔裡看到,以後再補。
非 { inline : 1 }的情況,會建立一個名為collection name的collection
?
1 2 3 4 5 6 7 8 | |
另一個例子:
?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | |
将{out: {replace: "test_result"}}改為{out: {reduce: "test_result"}}的話,可以看到沒運作一次res = db.foo.mapReduce(m, f, {out: {replace: "test_result"}});結果就會增加,如:
?
1 2 3 | |