Trochu pozdě na párty, ale snad to pomůže ostatním, kteří hledají řešení. Našel jsem způsob, jak toho dosáhnout pomocí agregačního rámce a kombinací $project a $unwind s $match tím, že je zřetězím dohromady. Udělal jsem to pomocí PHP, ale měli byste získat podstatu:
$ops = array(
array('$match' => array(
'collectionColumn' => 'value',
)
),
array('$project' => array(
'collection.subcollection' => 1
)
),
array('$unwind' => '$subCollection'),
array('$match' => array(
subCollection.subColumn => 'subColumnValue'
)
)
);
První shoda a projekt se používají pouze k odfiltrování, aby to bylo rychlejší, a poté uvolnění na podsbírce vyplivne každou položku podkolekce po položce, kterou lze filtrovat pomocí poslední shody.
Doufám, že to pomůže.
AKTUALIZACE (od Ryana Whealea):
Poté můžete $group
data zpět do původní struktury. Je to jako mít $elemMatch
který vrací více než jeden vnořený dokument:
array('$group' => array(
'_id' => '$_id',
'subcollection' => array(
'$push' => '$subcollection'
)
)
);
Přeložil jsem to z Node do PHP, takže jsem v PHP netestoval. Pokud někdo chce verzi Node, zanechte níže komentář a já mu vyhovím.