我刚刚陷入这个问题。我有两种猫鼬模式:
var childrenSchema = mongoose.Schema({ name: { type: String }, age: { type: Number, min: 0 } }); var parentSchema = mongoose.Schema({ name : { type: String }, children: [childrenSchema] });
问题是,如何childrenSchema从每个父文档中获取所有子文档(在这种情况下为对象)?假设我有一些数据:
childrenSchema
var parents = [ { name: "John Smith", children: [ { name: "Peter", age: 2 }, { name: "Margaret", age: 20 } ]}, { name: "Another Smith", children: [ { name: "Martha", age: 10 }, { name: "John", age: 22 } ]} ];
我想通过一个查询来检索所有18岁以上的孩子。每个答案将不胜感激,谢谢!
您可以$elemMatch在最新的MongoDB版本中用作查询投影运算符。从mongo shell:
$elemMatch
db.parents.find( {'children.age': {$gte: 18}}, {children:{$elemMatch:{age: {$gte: 18}}}})
这会从children数组中过滤掉较小的儿童文档:
children
{ "_id" : ..., "children" : [ { "name" : "Margaret", "age" : 20 } ] } { "_id" : ..., "children" : [ { "name" : "John", "age" : 22 } ] }
如您所见,子代仍在其父文档中分组。MongoDB查询返回集合中的文档。您可以使用聚合框架的$unwind方法将它们拆分为单独的文档:
$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子文档中的孩子的信息提升到顶层。
$match
$project