Trochę spóźniony na imprezę, ale mam nadzieję, że pomoże innym, którzy szukają rozwiązania. Znalazłem sposób, aby to zrobić, używając frameworka agregacji i łącząc $project i $unwind z $match, łącząc je razem. Zrobiłem to za pomocą PHP, ale powinieneś zrozumieć:
$ops = array(
array('$match' => array(
'collectionColumn' => 'value',
)
),
array('$project' => array(
'collection.subcollection' => 1
)
),
array('$unwind' => '$subCollection'),
array('$match' => array(
subCollection.subColumn => 'subColumnValue'
)
)
);
Pierwsze dopasowanie i projekt są używane tylko do odfiltrowania, aby przyspieszyć, a następnie odprężenie na podkolekcji wypluwa każdy element podkolekcji po elemencie, który można następnie przefiltrować za pomocą ostatecznego dopasowania.
Mam nadzieję, że to pomoże.
AKTUALIZACJA (od Ryana Wheale'a):
Następnie możesz $group
dane z powrotem do swojej pierwotnej struktury. To jak mieć $elemMatch
który zwraca więcej niż jeden poddokument:
array('$group' => array(
'_id' => '$_id',
'subcollection' => array(
'$push' => '$subcollection'
)
)
);
Przetłumaczyłem to z Node na PHP, więc nie testowałem w PHP. Jeśli ktoś chce wersję Node, zostaw komentarz poniżej, a ja się zobowiązuję.