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

首先介绍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 の使用を避けることをお勧めします。ほとんどの場合、特に関係するテーブルが 1 つだけの場合は、集計フレームワークで置き換えることができます。

リーリー

特定の構文については、自分で集計の構文を確認してください。 a*b実際に必要なのは、各レコードの a*b の値 (pipline1) であり、それを合計します (pipline2)。 リーリー

いいねを押す +0
Ty80

varマップ = function(){

リーリー

varreduce = function(key,values){

リーリー

上記の定義が完了したら、db.user.mapReduce(map,reduce,{out:"mr1"});を実行します。
次に、mr1のドキュメントをクエリします: db.mr1.find();
結果は次のようになります。入手しました

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート