2017-01-11 9 views
0

Ich habe eine MongoDB mit einer Sammlung von Dokumenten. Einige dieser Dokumente beziehen sich auf einen bestimmten Punkt in einem Prozess, aber nur das "Hauptdokument" enthält einige Informationen, die für meine Abfrage erforderlich sind.Gruppendokumente, die einer Bedingung in anderen Dokumenten entsprechen

Sagen wir, meine Sammlung handelte von Bäumen, die ich auf einer Baumfarm gepflanzt hatte. Das "Haupt" -Dokument würde während des Pflanzens erstellt werden, und jedes Jahr würde ich den Baum kontrollieren und bestimmte Dinge wie Höhe, Durchmesser usw. notieren. Aber grundlegende Informationen wie zB die Art und der Ort würden nur im "Haupt/initiales "Dokument.

Beispiel Dokumente:

{ 
     "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 
    } 

Jetzt möchte ich ‚Aggregat‘ oder eine andere Funktion verwenden, um die Anzahl von „1 Jahr“ Bäume zu zählen und vielleicht ihre Höhe Summe (ja, das Beispiel ist ein bisschen dumm), aber nur für eine bestimmte Art (zB Eiche).

Ich weiß derzeit nicht, wie das in einer Abfrage zu tun, aber derzeit zwei Aggregatabfragen verwenden und nach ID in MS Excel danach übereinstimmen.

Ich habe nicht die db-Format erstellt, sondern haben mit ihm zu arbeiten;)

Antwort

0

Sie so etwas wie dies versuchen.

$match Dokument zu halten mit species als oak

$lookup zur Sammlung kommen zurück auf die tree_id

$unwind verbunden Sammlung treeSpec

$match zu verbindenden Dokumente zu halten mit event als 1year

$group zu berechnen count und 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"} 
     } 
    } 
]); 
Verwandte Themen