MongoDB Map Reduce
按 MongoDB 的文檔介紹,Map-reduce是一種數據處理大數據轉化為有用的彙總結果。MongoDB使用MapReduce命令,map-reduce操作符。MapReduce一般用於處理大數據集。
MapReduce 命令:
以下是基本的MapReduce命令的語法:
>db.collection.mapReduce( function() {emit(key,value);}, //map function function(key,values) {return reduceFunction}, //reduce function { out: collection, query: document, sort: document, limit: number } )
map-reduce函數第一個查詢集合,然後映射結果文檔發出鍵 - 值對,然後減少基於多個值的鍵。
在上麵的語法:
- map 是一個JavaScript函數映射一個帶有關鍵字的值,並發出一個鍵值對
- reduce 是一個javscript函數減少或組中具有相同的密鑰的所有文檔
- out 指定map-reduce查詢結果的位置
- query 指定可選的選擇標準來選擇文檔
- sort 指定可選的排序標準
- limit 指定要返回文檔的可選最大數量
使用MapReduce:
考慮下麵的文檔結構存儲用戶的帖子。用戶的文檔存儲user_name和帖子的狀態。
{ "post_text": "yiibai is an awesome website for tutorials", "user_name": "mark", "status":"active" }
現在,我們將使用MapReduce函數在我們的帖子集合,來選擇所有活動的帖子,分組它們在user_name的基礎上再上計數,使用下麵的代碼計算每個用戶帖子的數量:
>db.posts.mapReduce( function() { emit(this.user_id,1); }, function(key, values) {return Array.sum(values)}, { query:{status:"active"}, out:"post_total" } )
上述的 MapReduce 查詢輸出以下結果:
{ "result" : "post_total", "timeMillis" : 9, "counts" : { "input" : 4, "emit" : 4, "reduce" : 2, "output" : 2 }, "ok" : 1, }
結果表明,共有4個符合查詢的文檔(status:"active"),map函數發出4個文檔帶鍵值對,最後是減少函數分組映射文檔具有相同的鍵進入2。
若要查看 MapReduce 的查詢結果,那麼使用 find 操作符:
>db.posts.mapReduce( function() { emit(this.user_id,1); }, function(key, values) {return Array.sum(values)}, { query:{status:"active"}, out:"post_total" } ).find()
上麵的查詢提供了以下結果,表明這兩個用戶tom和mark在活躍狀態的兩個帖子:
{ "_id" : "tom", "value" : 2 } { "_id" : "mark", "value" : 2 }
類似的方式,MapReduce查詢可以被用來構造大型複雜聚集的查詢。 使用自定義的JavaScript函數,使MapReduce的使用非常靈活強大。