mongodb mapreduce, 實作 select sum(a*b) from test
迷茫
迷茫 2017-05-02 09:18:23
0
2
539

首先介紹user collection

user {'username':, 'age':, 'account':}

下面是正常的group_by 和count實作

//SQL實作

select username,count(sku) from user group by username

//MapReduce實作

map=function (){ emit(this.username,{count:1}) } reduce=function (key,values){ var cnt=0; values.forEach(function(val){ cnt+=val.count;}); return {"count":cnt} }

//執行mapreduce

db.test.mapReduce(map,reduce,{out:"mr1"})

db.mr1.find()

{ "_id" : "Joe", "value" : { "count" : 416 } } { "_id" : "Josh", "value" : { "count" : 287 } } { "_id" : "Ken", "value" : { "count" : 297 } }

然後

//SQL實作

select sum(age * account) from user

//MapReduce實現,或用其他方法實作也可以
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回覆 (2)
曾经蜡笔没有小新

通常我們會建議避免在MongoDB中使用map/reduce,效能表現並不十分理想。大部分時候可以使用aggregation framework取代,特別是只涉及一個表格的時候。

db.user.aggregate([ {$group: {_id: '$username', count: {$sum: 1}}} ]);

具體語法就請自己查閱aggregation的語法咯。a*b會比較複雜一點,你實際上需要的是每筆記錄的a*b的值(pipline1),然後求和(pipline2):

db.user.aggregate([ {$group: {_id: "$username", temp_result: {$multiply: ["$age", "$account"]}}}, {$group: {_id: null, result: {$sum: "$temp_result"}}} ]);
    Ty80

    var map = function(){

    emit("sum",this.age*this.account); }

    var reduce = function(key,values){

    var cnt = 0; values.forEach(function(val){cnt+=val;}); return {"sumAll":cnt}; }

    以上定義完成後執行:db.user.mapReduce(map,reduce,{out:"mr1"});
    再查詢mr1的文檔:db.mr1.find();
    將會得到結果

      最新下載
      更多>
      網站特效
      網站源碼
      網站素材
      前端模板
      關於我們 免責聲明 Sitemap
      PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!