Ответ 1
Вы можете использовать $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
для производительности: первый раз через него исключаются родители с детьми no, возраст которых не менее 18 лет, поэтому $unwind
рассматривает только полезные документы. Второй $match
удаляет вывод $unwind
, который не соответствует, а $project
возвращает информацию о детях из поддокументов на верхний уровень.