U kunt $elemMatch
. gebruiken als een query-projectie-operator in de meest recente MongoDB-versies. Van de mongo-schelp:
db.parents.find(
{'children.age': {$gte: 18}},
{children:{$elemMatch:{age: {$gte: 18}}}})
Dit filtert documenten van jongere kinderen uit de children
reeks:
{ "_id" : ..., "children" : [ { "name" : "Margaret", "age" : 20 } ] }
{ "_id" : ..., "children" : [ { "name" : "John", "age" : 22 } ] }
Zoals u kunt zien, zijn kinderen nog steeds gegroepeerd in hun bovenliggende documenten. MongoDB-query's retourneren documenten uit verzamelingen. U kunt de $unwind
. van het aggregatieraamwerk gebruiken methode om ze in afzonderlijke documenten te splitsen:
> 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
}
Ik herhaal de $match
clausule voor prestaties:de eerste keer door het elimineert ouders met nee kinderen minstens 18 jaar oud, dus de $unwind
beschouwt alleen nuttige documenten. De tweede $match
verwijdert $unwind
uitvoer die niet overeenkomt, en de $project
hijst kinderinfo uit subdocumenten naar het hoogste niveau.