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是一個javascript功能,可以減少或分組具有相同鍵的所有文檔;
  • out指定map-reduce查詢結果的位置;
  • query指定選擇文檔的可選選擇條件;
  • sort指定可選的排序條件;
  • limit指定可選的最大文檔數;

使用MapReduce

請考慮存儲用戶帖子的以下文檔結構。 該文檔存儲用戶的user_name和帖子的狀態(status)。

{
   "post_text": "yiibai tutorials is an awesome website for tutorials",
   "user_name": "maxsu",
   "status":"active"
}

現在,我們將在posts集上使用mapReduce函數來選擇所有status的值爲active的帖子,並根據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)匹配,映射函數發出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()

上述查詢給出以下結果,表明用戶 tommaxsu 有兩個活動狀態的帖子 -

{ "_id" : "tom", "value" : 2 }
{ "_id" : "maxsu", "value" : 2 }

以類似的方式,MapReduce查詢可用於構建大型複雜聚合查詢。 使用自定義JavaScript函數可以使用MapReduce,它非常靈活和強大。