標籤:
1,概述
MapReduce是個非常靈活和強大的資料彙總工具。它的好處是可以把一個彙總任務分解為多個小的任務,分配到多伺服器上平行處理。MongoDB也提供了MapReduce,當然查詢語肯定是JavaScript。
MongoDB中的MapReduce相當於關聯式資料庫中的group by。使用MapReduce要實現兩個函數Map和Reduce函數。Map函數調用emit(key,value),遍曆Collection中所有的記錄,將key與value傳遞給Reduce函數進行處理。
2,基本文法
db.runCommand({mapreduce:<collection>,map:<mapfunction>,reduce:<reducefunction>,[,query:<query filter object>][,sort:<sorts the input objects using this key.Useful for optimization,like sorting by the emit key for fewer reduces>][,limit:<number of objects to return from collection>][,out:<see output options below>][,keeptemp:<true|false>][,finalize:<finalizefunction>][,scope:<object where fields go into javascript global scope>][,verbose:true]});
參數說明:
Mapreduce:要操作的目的地組合
Map:映射函數(產生索引值對序列,作為reduce函數參數)
Reduce:統計函數
Query:目標記錄過濾
Sort:目標記錄排序
Limit:限制目標記錄數量
Out:統計結果存放集合(不指定使用臨時集合,在用戶端斷開後自動刪除)
Keeptemp:是否保留臨時集合
Finalize:最終處理函數(對reduce返回結果進行最終整理後存入結果集合)
Scope:向map、reduce、finalize匯入外部變數
Verbose:顯示詳細的時間統計資訊。
3,應用執行個體
(1)查詢active表,每個cid對應的次數。相當於以cid分組。
map=function (){ emit(this.cid,{count:1})}reduce=function(key,values){ var cnt=0; values.forEach(function(val){ cnt+=val.count;}); return {"count":cnt};}db.active.mapReduce(map,reduce,{out:‘mr1‘})(2)按cid和日期分組map=function(){ emit({cdi:this.cid,cd:this.cd},{count:1})}reduce=function(key,values){ var cnt=0; values.forEach(function(val){ cnt+=val.count;}); return {"count":cnt};}db.active.mapReduce(map,reduce,{out:‘mr2‘})(3)每個cid的產品數量,總金額是多少map=function(){ emit(this.cid,{amount:this.price,count:1})}reduce=function (key,values){ var res={amount:0,count:0} values.forEach(function(val){ res.amount+=val.amount; res.count+=val.count }); return res;}db.test.mapReduce(map,reduce,{out:"mr3"})
我的總結:在mongodb中,map對集合分組。reduce對分組結果匯總。
mongodb學習3---mongo的MapReduce