Можете да използвате $elemMatch
като оператор за проекция на заявка в най-новите версии на MongoDB. От черупката на монго:
db.parents.find(
{'children.age': {$gte: 18}},
{children:{$elemMatch:{age: {$gte: 18}}}})
Това филтрира документите на по-малките деца от children
масив:
{ "_id" : ..., "children" : [ { "name" : "Margaret", "age" : 20 } ] }
{ "_id" : ..., "children" : [ { "name" : "John", "age" : 22 } ] }
Както можете да видите, децата все още са групирани в техните родителски документи. Заявките на MongoDB връщат документи от колекции. Можете да използвате $unwind
на рамката за агрегиране метод за разделянето им на отделни документи:
> 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
}
Повтарям $match
клауза за изпълнение:първия път чрез нея елиминира родителите сне деца на възраст поне 18 години, така че $unwind
разглежда само полезни документи. Вторият $match
премахва $unwind
изход, който не съвпада, и $project
издига информация за децата от поддокументи на най-високо ниво.