Um pouco atrasado para a festa, mas espero ajudar outras pessoas que estão procurando uma solução. Eu encontrei uma maneira de fazer isso usando a estrutura de agregação e combinando $project e $unwind com o $match, encadeando-os. Eu fiz isso usando PHP, mas você deve obter a essência:
$ops = array(
array('$match' => array(
'collectionColumn' => 'value',
)
),
array('$project' => array(
'collection.subcollection' => 1
)
),
array('$unwind' => '$subCollection'),
array('$match' => array(
subCollection.subColumn => 'subColumnValue'
)
)
);
A primeira correspondência e o projeto são usados apenas para filtrar para torná-lo mais rápido, então o desenrolar da subcoleção exibe cada subcoleção item por item, que pode ser filtrado usando a correspondência final.
Espero que ajude.
ATUALIZAÇÃO (de Ryan Wheale):
Você pode então
$group
os dados de volta à sua estrutura original. É como ter um $elemMatch
que retorna mais de um subdocumento:array('$group' => array(
'_id' => '$_id',
'subcollection' => array(
'$push' => '$subcollection'
)
)
);
Eu traduzi isso de Node para PHP, então não testei em PHP. Se alguém quiser a versão do Node, deixe um comentário abaixo e eu vou obrigar.