MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como selecionar subdocumentos com o MongoDB


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.