標籤:mongodb
mongoDB的map reduce使用
樣本:
res = db.runCommand({
mapreduce:‘liveEpgUserVisits‘,
map:function() {
emit({provice:this.provice}, {"data":[{"mac":this.mac}],visit:this.visitNum, userCount:0});
},
reduce:function(key, value) {
var ret = {data:[]}, visit=0
var userCount=0;
var macs = {};
var sum = 0;
for(var i in value) {
var ia = value[i];
for(var j in ia.data) {
if(!macs[ia.data[j].mac]) {
macs[ia.data[j].mac] = true;
ret.data.push(ia.data[j]);
userCount += 1;
}
}
sum += Number(ia.visit);
}
ret.visit = sum;
ret.userCount = userCount;
return ret;
},
query:{"inputTime":{$gte:ISODate("2014-09-17T14:20:00Z"),$lte:ISODate("2014-09-17T14:30:00Z")}},
finalize:function(key, values){
return [{count:values.data.length},{visit:values.visit},{userCount:values.userCount}];
},
out:‘tmp_mo_spcode_consignid_1‘,
verbose:true
})上面的樣本,map:key是省份,value是這個省份對應的mac值、訪問數量、使用者數量。reduce:擷取到每個省份的value,然後進行運算,在將結果返回。通過finalize參數指定輸出格式。如果不指定輸出格式則會安裝map的key和value格式進行輸出。
其中db.runCommand包含以下參數:
db.runCommand( { mapreduce : <collection>, map : <mapfunction>, reduce : <reducefunction> [, query : <query filter object>] [, sort : <sort the query. useful for optimization>] [, limit : <number of objects to return from collection>] [, out : <output-collection name>] [, keeptemp: <true|false>] [, finalize : <finalizefunction>] [, scope : <object where fields go into javascript global scope >] [, verbose : true] });
- mapreduce:指定要進行mapreduce處理的collection
- map:map函數 - reduce:reduce函數 - out:輸出結果的collection的名字,不指定會預設建立一個隨機名字的collection(如果使用了out選項,就不必指定keeptemp:true了,因為已經隱含在其中了) - query:一個篩選條件,只有滿足條件的文檔才會調用map函數。(query。limit,sort可以隨意組合) - sort:和limit結合的sort排序參數(也是在發往map函數前給文檔排序),可以最佳化分組機制 - limit:發往map函數的文檔數量的上限(要是沒有limit,單獨使用sort的用處不大) - keytemp:true或false,表明結果輸出到的collection是否是臨時的,如果想在串連關閉後仍然保留這個集合,就要指定keeptemp為true,如果你用的是MongoDB的mongo用戶端串連,那必須exit後才會刪除。如果是指令碼執行,指令碼退出或調用close會自動刪除結果collection - finalize:是函數,它會在執行完map、reduce後再對key和value進行一次計算並返回一個最終結果,這是處理過程的最後一步,所以finalize就是一個計算平均數,剪裁數組,清除多餘資訊的恰當時機 - scope:javascript代碼中要用到的變數,在這裡定義的變數在map,reduce,finalize函數中可見 - verbose:用於調試的詳細輸出選項,如果想看MpaReduce的運行過程,可以設定其為true。也可以print把map,reduce,finalize過程中的資訊輸出到伺服器日誌上。
mongoDB的map reduce