Ein bisschen spät zur Party, aber hoffentlich hilft es anderen, die nach einer Lösung suchen. Ich habe einen Weg gefunden, dies mithilfe des Aggregations-Frameworks zu tun und $project und $unwind mit $match zu kombinieren, indem ich sie miteinander verkette. Ich habe es mit PHP gemacht, aber Sie sollten das Wesentliche verstehen:
$ops = array(
array('$match' => array(
'collectionColumn' => 'value',
)
),
array('$project' => array(
'collection.subcollection' => 1
)
),
array('$unwind' => '$subCollection'),
array('$match' => array(
subCollection.subColumn => 'subColumnValue'
)
)
);
Die erste Übereinstimmung und das erste Projekt werden nur zum Herausfiltern verwendet, um es schneller zu machen, dann spuckt die Abwicklung der Untersammlung jede Untersammlung Artikel für Artikel aus, die dann mit der letzten Übereinstimmung gefiltert werden kann.
Hoffe das hilft.
UPDATE (von Ryan Wheale):
Sie können dann $group
die Daten wieder in ihre ursprüngliche Struktur. Es ist wie ein $elemMatch
die mehr als ein Filialdokument zurückgibt:
array('$group' => array(
'_id' => '$_id',
'subcollection' => array(
'$push' => '$subcollection'
)
)
);
Ich habe dies von Node nach PHP übersetzt, also habe ich es nicht in PHP getestet. Wenn jemand die Node-Version haben möchte, hinterlasse unten einen Kommentar und ich werde dem nachkommen.