sql >> Base de Datos >  >> NoSQL >> MongoDB

Mongoose:búsqueda de subdocumentos por criterios

Puedes usar $elemMatch como operador de proyección de consultas en las versiones más recientes de MongoDB. Desde el shell mongo:

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

Esto filtra los documentos de los niños más pequeños fuera de los children matriz:

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

Como puede ver, los elementos secundarios aún se agrupan dentro de sus documentos principales. Las consultas de MongoDB devuelven documentos de las colecciones. Puede usar el marco de agregación $unwind método para dividirlos en 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 el $match clausula de cumplimiento:la primera vez mediante ella se elimina a los padres con no niños de al menos 18 años, por lo que $unwind sólo considera documentos útiles. El segundo $match elimina $unwind salida que no coincide, y el $project eleva la información de los niños de los subdocumentos al nivel superior.