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.