2017-01-11 2 views
0

У меня есть MongoDB с коллекцией документов. Некоторые из этих документов относятся к определенной точке процесса, но только «основной» документ содержит некоторую информацию, необходимую для моего запроса.Документы группы, соответствующие условию в других документах

Скажем, моя коллекция была о деревьях, которые я посадил на дереве. «Основной» документ будет создан при посадке, и каждый год я буду контролировать дерево и учитывать некоторые вещи, такие как высота, диаметр и т. Д. Но основная информация, такая как вид и местоположение, будет храниться только в «главном/первоначальный "документ.

Примеры документов:

{ 
     "tree_id" : 0001, 
     "event": "planting" 
     "species" : "maple", 
     "location" : "alabama01", 
     "height" : 0, 
     "diameter" : 0 
    } 

    { 
     "tree_id" : 0001, 
     "event": "1year" 
     "height" : 1.5, 
     "diameter" : 2 
    } 

    { 
     "tree_id" : 0001, 
     "event": "2year" 
     "height" : 3, 
     "diameter" : 2.5 
    } 

    { 
     "tree_id" : 0005, 
     "event": "planting" 
     "species" : "oak", 
     "location" : "new_hampshire03", 
     "height" : 0, 
     "diameter" : 0 
    } 

    { 
     "tree_id" : 0005, 
     "event": "1year" 
     "height" : 1, 
     "diameter" : 2 
    } 

Теперь я хочу использовать «совокупный» или другую функцию для подсчета количества «1Year» деревьев и, возможно, подвести их высоту (да, пример немного глупо), но только для определенного вида (т.е. дуба).

В настоящее время я не знаю, как это сделать в одном запросе, но в настоящее время используют два совокупных запроса и сопоставление по идентификатору в MS Excel впоследствии.

Я не создал формат дб, но должны работать с ней;)

ответ

0

Вы можете попробовать что-то вроде этого.

$match сохранить документ с species в oak

$lookup присоединиться назад к коллекции на tree_id

$unwind присоединился к коллекции treeSpec

$match держать присоединившихся документы с event в 1year

$group для расчета count и totalHeight

db.collection_name.aggregate([ 
    {$match:{"species":"oak"}}, 
    {$lookup: { 
     from: "collection_name", 
     localField: "tree_id", 
     foreignField: "tree_id", 
     as: "treeSpec" 
     } 
    }, 
    {$unwind:"$treeSpec"}, 
    {$match:{"treeSpec.event":"1year"}}, 
    {$group:{ 
     _id:"$species", 
     count:{$sum:1}, 
     totalHeight:{$sum:"$treeSpec.height"} 
     } 
    } 
]);