位置:首頁 > 數據庫 > MongoDB教學 > MongoDB Map Reduce

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的使用非常靈活強大。