mongoDB的map reduce,mongoDBmapreduce
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的mapreduce 教我一下?
map:可以理解成需要填充的資料。在sql中,很像是後面的where條件所需要篩選的部分;
reduce:可以理解成需要顯示的欄位;
因為mapreduce的使用對於初學者來說,在理解上非常的困難。建議先從簡單的group方法入手進行學習;
另外一點,MapReduce的效能是非常低的,除非是做背景統計操作,否則一定不要用MapReduce或給予它的查詢作為前端的資料訪問方式。
mongodb的多表關聯哪種處理方式最優
需求是這樣的,一個遊戲後台系統,需要對每天產生的記錄檔進行分析。遊戲日誌有使用者註冊、使用者登入等。使用mapreduce將使用者註冊資訊統計到一個集合user_register,將使用者登入資訊去重後放到另一個集合user_login,現在需要根據使用者名稱關聯這個兩個集合統計出一些資料。但查了很多資料沒有發現mongodb在這方面有很好的解決辦法,也想過使用mapreduce來解決,但根據這段時間我使用mapreduce的心得,感覺mapreduce只能處理一個集合,不能同時處理兩個集合。目前我想出的一個解決方案就是把這兩個集合中的資料都讀出來,然後使用程式碼處理。這種方式雖然能暫時解決問題,但肯定不是最優的。所以就冒昧給您發了這條資訊,看您能不能給一些合理的建議或方法,先在此謝過!!