MongoDB - MapReduce



根據 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 和帖子的狀態。

{
   "post_text": "tutorialspoint 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 函式發出了 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** 兩個使用者都分別有兩個處於活動狀態的帖子:

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

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

廣告