如何过滤mongoDB中的子文档?

我有这个mlab文件:

{ "_id": { "$oid": "572b2cdfc80eb653c302f5e9" }, "year": 2014, "students": [ { "id": 5, "firstName": "Joe", "lastName": "know", "GPA": 67 }, { "id": 3, "firstName": "Peter", "lastName": "Jones", "GPA": 77 }, { "id": 6, "firstName": "Yossi", "lastName": "Haim", "GPA": 68 }, { "id": 13, "firstName": "Chen", "lastName": "Si", "GPA": 92 } ] } 

我得到:(年也是一个参数)

 gradeM= mongoose.model('Grade',grade); gradeM.find({'year':year},'-_id').exec(function (err, data) { if (err) console.log("err: " + err); console.log(JSON.stringify(data)); }); 

尽pipe从集合中获取数据我做得很好,但是我希望从返回的文档中排除GPA <90的所有学生数组logging。 尝试了一些不同的汇总和匹配function,但我似乎无法得到正确的语法。

最终结果应该如下所示:

  { "year": 2014, "students": [ { "id": 13, "firstName": "Chen", "lastName": "Si", "GPA": 92 } ] } 

我总是可以循环使用JS的文件,但我正在寻找一种方法来立即得到准备好的结果。
谢谢

你可以$放松学生,过滤它们,然后添加到组 – 请参阅下面的示例:

 db.yush.aggregate([ {$match:{"year":2014}}, { $unwind : "$students" }, { $match : { "students.GPA" : { $lt : 90 } } }, { $group : { _id : "$year" , students : { $push : "$students" } } } ]) 

最后使用$ project将_id更改为year

玩得开心 – 欢迎任何评论!

你可以使用$ elemMatch 。

尝试如下

 gradeM= mongoose.model('Grade',grade); gradeM.find({'year':year, students: { $elemMatch: GPA: { $lt: 90 } }},'-_id').exec(function (err, data) { if (err) console.log("err: " + err); console.log(JSON.stringify(data)); }); 

你可以尝试使用聚合

 gradeM.aggregate( {$match: {year: 2014}},{ $unwind: '$students'}, { $match: {'students.GPA': {$lt: 90}}}, { $group: {_id: '$_id', year : '$year', students: {$push: {id:'$students.id', firstName:'$students.firstName'}}}}) 

输出:

 { "_id" : ObjectId("572b2cdfc80eb653c302f5e9"), "year":2014, "students" : [ { "id" : 5, "firstName" : "Joe" }, { "id" : 3, "firstName" : "Peter" }, { "id" : 6, "firstName" : "Yossi" } ] } 

另外,你可以试试

 gradeM.aggregate([ { $match: {year: year}}, { $project: { students: {$filter: { input: '$students', as: 'students', cond: {$lt: ['$$students.GPA', 90]} }} }} ])