Малко късно за партито, но се надяваме да помогнем на други, които търсят решение. Намерих начин да направя това с помощта на рамката за агрегиране и комбинирането на $project и $unwind с $match, като ги свързвам заедно. Направих го с PHP, но трябва да разберете същността:
$ops = array(
array('$match' => array(
'collectionColumn' => 'value',
)
),
array('$project' => array(
'collection.subcollection' => 1
)
),
array('$unwind' => '$subCollection'),
array('$match' => array(
subCollection.subColumn => 'subColumnValue'
)
)
);
Първото съвпадение и проект се използват само за филтриране, за да стане по-бързо, след което при отвиване на подколекция изхвърля всеки елемент от подколекция, който след това може да се филтрира с помощта на окончателното съвпадение.
Надявам се това да помогне.
АКТУАЛИЗАЦИЯ (от Райън Уийл):
След това можете да $group
данните обратно в първоначалната им структура. Това е като да имате $elemMatch
който връща повече от един поддокумент:
array('$group' => array(
'_id' => '$_id',
'subcollection' => array(
'$push' => '$subcollection'
)
)
);
Преведох това от Node на PHP, така че не съм тествал в PHP. Ако някой иска версията на Node, да остави коментар по-долу и ще се задължа.