2014-12-13 5 views
7

Ich bin ziemlich neu in MongoDB, projizieren und ich habe, was hoffentlich Frage ist eine einfache:Wie nur passende Felder von verschachtelten Array in Mongo Shell Abfrage

ich ein verschachteltes Schema haben, wo ich ein Feld haben, das eine ist Array, wobei jedes Element dieses Arrays ein Objekt ist, das selbst ein Array-Feld hat.

Zum Beispiel:

> db.mytest.insert({ 
    name: 'a', 
    top: [ 
     {x:1, y:2, nest: [{p:1, q:2}, {p:2, q:3}]}, 
     {x:2, y:3, nest: [{p:4, q:5}, {p:6, q:7}]} 
    ] 
    }) 

ich für bestimmte Werte von p abfragen kann ganz gut, und kann sogar mein Ergebnis an das erste Anpassungselement von top begrenzen:

> db.mytest.findOne({'top.nest': {$elemMatch: {p:6}}}, {'top.nest.$': 1}) 
{"_id":ObjectId(...), top: [{x:2, y: 3, nest: [{p:4, q:5}, {p:6, q:7}]}]} 

Das bringt mich zu meine Frage: {'top.nest.$': 1} und {'top.$': 1} als mein Projektionsdokument liefern beide das gleiche Ergebnis. Wie kann ich meine Suchergebnisse so beschränken, dass nur das erste übereinstimmende Element von nest enthalten ist?

Benötige ich einen zweiten Durchlauf, der das Ergebnis dieses Abfragetyps iteriert?

Antwort

6

Ok, der Trick war die aggregation framework, specifically unwind.

> db.mytest.aggregate({$unwind: '$top'}, 
         {$unwind: '$top.nest'}, 
         {$match: {'top.nest.p': 6}} 
) 

Obwohl in dem Fall, dass ich mehrere Unter Spiele in einem einzigen Objekt hätte, würde dies mehrere Ergebnisse zurückgeben, anstatt in ihrer ursprünglichen Form gruppiert. Ich nehme an, ich kann eine $group in die Pipeline setzen.

Obwohl die verwandten Links, die ich gefunden habe vorgeschlagen, Schema Redesign als die einzige vollständige Lösung im Moment, so ist dies definitiv besser als nichts.

Verwandte Themen