根據MongoDB文檔,Map reduce是一種數據處理范式,用于將大量數據壓縮成有用的聚合結果。MongoDB使用mapReduce命令進行map reduce操作。MapReduce通常用于處理大型數據集。
以下是基本mapReduce命令的語法-
>db.collection.mapReduce( function() {emit(key,value);}, //map函數 function(key,values) {return reduceFunction}, { //reduce函數 out: collection, query: document, sort: document, limit: number } )
map-reduce函數首先查詢集合,然后映射結果文檔以發(fā)出鍵-值對,然后根據具有多個值的鍵對其進行縮減。
在上面的語法中-
map
是一個javascript函數,該函數將一個鍵映射到一個值并發(fā)出一個鍵-值對
reduce
是一個javascript函數,用于減少或分組所有具有相同密鑰的文檔
out
指定map-reduce查詢結果的位置
query
指定用于選擇文檔的可選選擇標準
sort
指定可選的排序條件
limit
指定要返回的可選最大文檔數
考慮以下存儲用戶帖子的文檔結構。該文檔存儲用戶的user_name和發(fā)布狀態(tài)。
{ "post_text": "nhooo is an awesome website for tutorials", "user_name": "mark", "status":"active" }
現在,我們將在posts
集合上使用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函數發(fā)出4個具有鍵值對的文檔,最后reduce函數將具有相同鍵的映射文檔分為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都有兩個post處于活動狀態(tài)–
{ "_id" : "tom", "value" : 2 } { "_id" : "mark", "value" : 2 }
以類似的方式,MapReduce查詢可用于構造大型復雜的聚合查詢。自定義Javascript函數的使用利用了MapReduce,它非常靈活且功能強大。