mongoDB的map reduce,mongoDBmapreduce

來源:互聯網
上載者:User

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只能處理一個集合,不能同時處理兩個集合。目前我想出的一個解決方案就是把這兩個集合中的資料都讀出來,然後使用程式碼處理。這種方式雖然能暫時解決問題,但肯定不是最優的。所以就冒昧給您發了這條資訊,看您能不能給一些合理的建議或方法,先在此謝過!!
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.