Немного опоздал на вечеринку, но, надеюсь, поможет другим, кто ищет решение.Я нашел способ сделать это, используя структуру агрегации и комбинируя $ 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, оставьте комментарий ниже, и я обязуюсь.