Un peu tard pour la fête, mais j'espère que cela aidera les autres qui recherchent une solution. J'ai trouvé un moyen de le faire en utilisant le cadre d'agrégation et en combinant $project et $unwind avec le $match, en les enchaînant ensemble. Je l'ai fait en utilisant PHP mais vous devriez comprendre l'essentiel :
$ops = array(
array('$match' => array(
'collectionColumn' => 'value',
)
),
array('$project' => array(
'collection.subcollection' => 1
)
),
array('$unwind' => '$subCollection'),
array('$match' => array(
subCollection.subColumn => 'subColumnValue'
)
)
);
La première correspondance et le premier projet sont simplement utilisés pour filtrer pour le rendre plus rapide, puis le déroulement sur la sous-collection recrache chaque sous-collection élément par élément qui peut ensuite être filtré à l'aide de la correspondance finale.
J'espère que ça aide.
MISE À JOUR (de Ryan Wheale) :
Vous pouvez alors $group
les données dans leur structure d'origine. C'est comme avoir un $elemMatch
qui renvoie plus d'un sous-document :
array('$group' => array(
'_id' => '$_id',
'subcollection' => array(
'$push' => '$subcollection'
)
)
);
J'ai traduit ceci de Node en PHP, donc je n'ai pas testé en PHP. Si quelqu'un veut la version Node, laissez un commentaire ci-dessous et je serai obligé.