2013-10-09 3 views
1

Скажем, у меня есть данные, что выглядит следующим образом:

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

И я хочу сделать агрегат, который возвращает среднюю чистую стоимость каждого имени «john» или «jack» как один номер.

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

Это агрегирование вернет среднюю чистую стоимость для людей в коллекции с тем же именем. Как я бы усреднил два (или более) конкретных имени? Я знаю, что могу сделать $match, чтобы отфильтровать всех, кроме Джона и Джека, но я не знаю, как их объединить.

ответ

0

Вы можете использовать $match в сочетании с $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 
} 

Обратите внимание, что я должен был придумать какую-то фальшивую _id для $group, потому что нам нужен один и тот же идентификатор для результатов как домкрат и сортира.

Смежные вопросы