您可以
$elemMatch在最新的MongoDB版本中用作查询投影运算符。从mongo shell:
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子文档中的孩子的信息提升到顶层。



