MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment sélectionner des sous-documents avec MongoDB

Un peu tard pour la fête, mais j'espère que cela aidera les autres qui recherchent une solution. J'ai trouvé un moyen de le faire en utilisant le cadre d'agrégation et en combinant $project et $unwind avec le $match, en les enchaînant ensemble. Je l'ai fait en utilisant PHP mais vous devriez comprendre l'essentiel :

    $ops = array(
        array('$match' => array(
                'collectionColumn' => 'value',
            )
        ),
        array('$project' => array(
                'collection.subcollection' => 1
            )
        ),
        array('$unwind' => '$subCollection'),
        array('$match' => array(
                subCollection.subColumn => 'subColumnValue'
            )
        )
    );

La première correspondance et le premier projet sont simplement utilisés pour filtrer pour le rendre plus rapide, puis le déroulement sur la sous-collection recrache chaque sous-collection élément par élément qui peut ensuite être filtré à l'aide de la correspondance finale.

J'espère que ça aide.

MISE À JOUR (de Ryan Wheale) :

Vous pouvez alors $group les données dans leur structure d'origine. C'est comme avoir un $elemMatch qui renvoie plus d'un sous-document :

array('$group' => array(
        '_id' => '$_id',
        'subcollection' => array(
            '$push' => '$subcollection'
        )
    )
);

J'ai traduit ceci de Node en PHP, donc je n'ai pas testé en PHP. Si quelqu'un veut la version Node, laissez un commentaire ci-dessous et je serai obligé.