我刚刚遇到这个问题。我有两个Mongoose模式:
var childrenSchema = mongoose.Schema({ name: { type: String },age: { type: Number,min: 0 } }); var parentSchema = mongoose.Schema({ name : { type: String },children: [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 } ]} ];
解决方法
您可以在最近的MongoDB版本中使用$ elemmatch作为查询投影运算符。从mongo shell:
db.parents.find( {'children.age': {$gte: 18}},{children:{$elemmatch:{age: {$gte: 18}}}})
这样可以将孩子们的小孩文档从儿童数组中过滤出来:
{ "_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岁的父母,所以$解开只考虑有用的文件。第二个$ match删除不符合的$ unwind输出,$ project将子信息从子文档提升到顶层。