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

首先介绍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实现,或者用其他方法实现也可以
???????????????????

迷茫
迷茫

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

membalas semua(2)
曾经蜡笔没有小新

Biasanya kami mengesyorkan mengelak daripada menggunakan peta/kurangkan dalam MongoDB, kerana prestasinya tidak begitu ideal. Selalunya ia boleh digantikan dengan rangka kerja pengagregatan, terutamanya apabila hanya satu jadual yang terlibat.

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

Sila semak sintaks pengagregatan untuk sintaks tertentu. a*bIa akan menjadi sedikit lebih rumit Perkara yang anda perlukan sebenarnya ialah nilai a*b setiap rekod (pipline1), dan kemudian jumlah (pipline2):

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

peta var = function(){

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

var reduce = fungsi(kunci,nilai){

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

Selepas definisi di atas selesai, laksanakan: db.user.mapReduce(map,reduce,{out: "mr1"});
Kemudian tanya dokumen mr1: db.mr1.find();
akan Mendapat hasil

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan