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

Mongoose - encontrando subdocumentos por critérios


Você pode usar $elemMatch como um operador de projeção de consulta nas versões mais recentes do MongoDB. Da concha do mongo:
db.parents.find(
    {'children.age': {$gte: 18}},
    {children:{$elemMatch:{age: {$gte: 18}}}})

Isso filtra os documentos das crianças mais novas dos children variedade:
{ "_id" : ..., "children" : [ { "name" : "Margaret", "age" : 20 } ] }
{ "_id" : ..., "children" : [ { "name" : "John", "age" : 22 } ] }

Como você pode ver, os filhos ainda estão agrupados dentro de seus documentos pai. As consultas do MongoDB retornam documentos de coleções. Você pode usar o $unwind da estrutura de agregação método para dividi-los em documentos separados:
> 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
}

Repito o $match cláusula para desempenho:a primeira vez elimina os pais com não crianças com pelo menos 18 anos, então o $unwind considera apenas documentos úteis. O segundo $match remove $unwind saída que não corresponde, e o $project eleva as informações das crianças dos subdocumentos para o nível superior.