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.