2013-10-09 2 views
1

Dire que j'ai données qui ressemble à ceci:

{ 
    "name":"jack", 
    "net_worth":1000 
} 

Et je veux faire un agrégat qui retourne la valeur nette moyenne de tout le monde nommé "john" ou "jack" comme un seul nombre.

db.mycollection.aggregate([ 
    {$group: 
     {"_id":"$name", 
     "average_worth":{$avg:"$net_worth"} 
     } 
    }  
]) 

Cette agrégation renvoie la valeur nette moyenne pour les personnes de la collection ayant le même nom. Comment puis-je faire la moyenne de deux noms spécifiques (ou plus)? Je sais que je peux faire un $match pour filtrer tout le monde sauf Johns et Jacks, mais je ne sais pas comment les combiner.

Répondre

0

Vous pouvez utiliser $match combiné avec $or:

> db.ppl.insert({"name": "jack", "worth" : 240000}); 
> db.ppl.insert({"name": "john", "worth" : 14000}); 
> db.ppl.insert({"name": "bill", "worth" : 88000000}); 

> db.ppl.aggregate([ 
    { $match:{$or:[{name:"jack"},{name:"john"}]}}, 
    {$group : { "_id" : 1, "average_worth":{$avg:"$worth"} } }]) 
{ 
     "result" : [ 
       { 
         "_id" : 1, 
         "average_worth" : 127000 
       } 
     ], 
     "ok" : 1 
} 

Notez que je devais venir avec quelques _id faux pour le $group, parce que nous avons besoin du même identifiant pour les résultats de Jack et John.

Questions connexes