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

Mongoose - trouver des sous-documents par critères

Vous pouvez utiliser $elemMatch en tant qu'opérateur de projection de requête dans les versions les plus récentes de MongoDB. Depuis le shell mongo :

db.parents.find(
    {'children.age': {$gte: 18}},
    {children:{$elemMatch:{age: {$gte: 18}}}})

Cela filtre les documents des enfants plus jeunes hors des children tableau :

{ "_id" : ..., "children" : [ { "name" : "Margaret", "age" : 20 } ] }
{ "_id" : ..., "children" : [ { "name" : "John", "age" : 22 } ] }

Comme vous pouvez le voir, les enfants sont toujours regroupés dans leurs documents parents. Les requêtes MongoDB renvoient des documents à partir de collections. Vous pouvez utiliser le framework d'agrégation $unwind méthode pour les diviser en documents distincts :

> db.parents.aggregate({
    $match: {'children.age': {$gte: 18}}
}, {
    $unwind: '$children'
}, {
    $match: {'children.age': {$gte: 18}}
}, {
    $project: {
        name: '$children.name',
        age:'$children.age'
    }
})
{
    "result" : [
        {
            "_id" : ObjectId("51a7bf04dacca8ba98434eb5"),
            "name" : "Margaret",
            "age" : 20
        },
        {
            "_id" : ObjectId("51a7bf04dacca8ba98434eb6"),
            "name" : "John",
            "age" : 22
        }
    ],
    "ok" : 1
}

Je répète le $match clause de performance :la première fois, elle élimine les parents avec non les enfants âgés d'au moins 18 ans, donc le $unwind ne considère que les documents utiles. Le deuxième $match supprime $unwind sortie qui ne correspond pas, et le $project hisse les informations des enfants des sous-documents au niveau supérieur.