Maison  >  Questions et réponses  >  le corps du texte

mongodb mapreduce, 实现 select sum(a*b) from test

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

迷茫迷茫2747 Il y a quelques jours608

répondre à tous(2)je répondrai

  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-05-02 09:20:23

    Habituellement, nous recommandons d'éviter d'utiliser map/reduce dans MongoDB, car les performances ne sont pas très idéales. La plupart du temps, il peut être remplacé par le cadre d'agrégation, notamment lorsqu'une seule table est impliquée.

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

    Veuillez vérifier la syntaxe d'agrégation pour une syntaxe spécifique. a*bCe sera un peu plus compliqué. Ce dont vous avez réellement besoin, c'est de la valeur de a*b de chaque enregistrement (pipline1), puis de la somme (pipline2) :

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

    répondre
    0
  • PHP中文网

    PHP中文网2017-05-02 09:20:23

    var map = fonction(){

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

    var réduire = fonction (clé, valeurs){

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

    Une fois la définition ci-dessus terminée, exécutez : db.user.mapReduce(map,reduce,{out: "mr1"});
    Ensuite, interrogez le document de mr1 : db.mr1.find();
    obtiendra des résultats

    répondre
    0
  • Annulerrépondre