鍍金池/ 教程/ 數(shù)據(jù)庫/ Map Reduce
更新文檔
GridFS
Rockmongo 管理工具
Map Reduce
Java
創(chuàng)建備份
數(shù)據(jù)模型
創(chuàng)建數(shù)據(jù)庫
映射
查詢文檔
索引限制
ObjectId
刪除文檔
數(shù)據(jù)類型
高級(jí)索引
索引
優(yōu)勢
記錄排序
查詢分析
插入文檔
刪除集合
全文檢索
創(chuàng)建集合
概述
數(shù)據(jù)庫引用
覆蓋索引查詢
安裝環(huán)境
PHP
刪除數(shù)據(jù)庫
固定集合
關(guān)系
聚合
自動(dòng)增長
復(fù)制
限制記錄
部署
分片
正則表達(dá)式
原子操作

Map Reduce

在 MongoDB 文檔中,Map-Reduce(映射歸約)是一種將大量數(shù)據(jù)壓縮成有用的聚合結(jié)果的數(shù)據(jù)處理范式。MongoDB 使用 mapReduce 命令來實(shí)現(xiàn)映射歸約操作。映射歸約通常用來處理大型數(shù)據(jù)。

映射歸約命令

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
   }
)

mapReduce 函數(shù)首先查詢集合,然后將結(jié)果文檔利用 emit 函數(shù)映射為鍵值對(duì),然后再根據(jù)有多個(gè)值的鍵來簡化。

上述語法格式中:

  • map 一個(gè) JavaScript 函數(shù),將一個(gè)值與鍵對(duì)應(yīng)起來,并生成鍵值對(duì)。
  • reduce 一個(gè) JavaScript 函數(shù),用來減少或組合所有擁有同一鍵的文檔。
  • out 指定映射歸約查詢結(jié)果的位置。
  • query 指定選擇文檔所用的選擇標(biāo)準(zhǔn)(可選的)。
  • sort 指定可選的排序標(biāo)準(zhǔn)。
  • limit 指定返回的文檔的最大數(shù)量值(可選的)。

使用 mapReduce

以下面這個(gè)存儲(chǔ)用戶發(fā)帖的文檔結(jié)構(gòu)。該文檔存儲(chǔ)用戶的用戶名(user_name)和發(fā)帖狀態(tài)(status)。

{
   "post_text": "tutorialspoint is an awesome website for tutorials",
   "user_name": "mark",
   "status":"active"
}

posts 集合上使用 mapReduce 函數(shù)選擇所有的活躍帖子,將它們基于用戶名組合起來,然后計(jì)算每個(gè)用戶的發(fā)帖量。代碼如下:

>db.posts.mapReduce( 
   function() { emit(this.user_id,1); }, 
   function(key, values) {return Array.sum(values)}, 
      {  
         query:{status:"active"},  
         out:"post_total" 
      }
)

上面的 mapReduce 查詢輸出結(jié)果如下:

{
   "result" : "post_total",
   "timeMillis" : 9,
   "counts" : {
      "input" : 4,
      "emit" : 4,
      "reduce" : 2,
      "output" : 2
   },
   "ok" : 1,
}

結(jié)果顯示,只有 4 個(gè)文檔符合查詢條件(status:"active"),于是 map 函數(shù)就生成了 4 個(gè)帶有鍵值對(duì)的文檔,而最終 reduce 函數(shù)將具有相同鍵值的映射文檔變?yōu)榱?2 個(gè)。

要想查看 mapReduce 查詢的結(jié)果,使用 find 操作符。

>db.posts.mapReduce( 
   function() { emit(this.user_id,1); }, 
   function(key, values) {return Array.sum(values)}, 
      {  
         query:{status:"active"},  
         out:"post_total" 
      }
).find()

上述查詢的結(jié)果如下,顯示出用戶 tom 和 mark 都發(fā)了 2 個(gè)活躍的帖子。

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

MapReduce 查詢同樣也可以用來構(gòu)建大型復(fù)雜的聚合查詢,自定義 JavaScript 函數(shù)使得 MapReduce 更為靈活與強(qiáng)大。

上一篇:查詢文檔下一篇:關(guān)系