$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
有用なドキュメントのみを考慮します。 2番目の$match
$unwind
を削除します 一致しない出力、および$project
子供の情報をサブドキュメントからトップレベルに引き上げます。