Een beetje laat op het feest, maar hopelijk helpt het anderen die op zoek zijn naar een oplossing. Ik heb een manier gevonden om dit te doen door het aggregatieraamwerk te gebruiken en $project en $unwind te combineren met $match, door ze aan elkaar te koppelen. Ik heb het gedaan met PHP, maar je zou de essentie moeten begrijpen:
$ops = array(
array('$match' => array(
'collectionColumn' => 'value',
)
),
array('$project' => array(
'collection.subcollection' => 1
)
),
array('$unwind' => '$subCollection'),
array('$match' => array(
subCollection.subColumn => 'subColumnValue'
)
)
);
De eerste match en het eerste project worden alleen gebruikt om uit te filteren om het sneller te maken, waarna de afwikkeling op subcollectie elke subcollectie item voor item uitspuugt, die vervolgens kan worden gefilterd met behulp van de laatste match.
Ik hoop dat dat helpt.
UPDATE (van Ryan Wheale):
U kunt dan $group
de gegevens terug in de oorspronkelijke structuur. Het is alsof je een $elemMatch
. hebt die meer dan één subdocument retourneert:
array('$group' => array(
'_id' => '$_id',
'subcollection' => array(
'$push' => '$subcollection'
)
)
);
Ik heb dit vertaald van Node naar PHP, dus ik heb het niet getest in PHP. Als iemand de Node-versie wil, laat dan hieronder een reactie achter en ik zal het doen.