{
"Name": "Nagalokesh",
"Courses": [
{
"Name": "ECE",
"Faculity": "Priyadharshini",
"ExamDate": "Thu Aug 27 2015 00:00:00 GMT+0530 (India Standard Time)",
"Marks": [
{
"testCode": "EC-01",
"testMarks": "98"
},
{
"testCode": "EC-02",
"testMarks": "94"
}
]
},
{
"Name": "CS",
"Faculity": "Radika",
"ExamDate": "Thu Aug 27 2015 00:00:00 GMT+0530 (India Standard Time)",
"Marks": [
{
"testCode": "CS-01",
"testMarks": "96"
},
{
"testCode": "CS-02",
"testMarks": "96"
}
]
}
],
"StudentCode": "Software"
}
在上面的对象中如何访问课程对象 中只有“CS”或“ECE”对象,没有任何不需要的信息
我在 mongo shell
中尝试了此命令db.studentMarksPortal.find({"Name":'Nagalokesh'},{"Courses":{$elemMatch:{"Name": 'ECE'}}})
输出就是这个
{ "_id" : ObjectId("5aaa0005572a4c172030c852"), "Courses" : [ { "Name" : "ECE", "Faculity" : "Priyadharshini", "ExamDate" : "Thu Aug 27 2015 00:00:00 GMT+0530 (India Standard Time)", "Marks" : [ { "testCode" : "EC-01", "testMarks" : "98" }, { "testCode" : "EC-02", "testMarks" : "96" }, { "testCode" : "Final", "testMarks" : "99" } ] } ] }
但是 当我尝试 Node Js 时,如下所示
db.collection(collectionName).find({"Name":studentName},{"Courses":{$elemMatch:{"Name": studentCourse}}}).toArray(
function(findErr, result){
if (findErr) reject(findErr);
client.close();
console.log(result);
resolve(result);
}
);
});
它返回nagalokesh的完整记录为什么?任何人都可以帮助我如何才能获得选定的课程?
答案 0 :(得分:1)
您可以在查询中使用查找过滤器。
db.collection(collectionName).find({'Courses'}, { "_id": 0, "Name": 1 });
这个具体的例子是使用本机mongo库,但同样的借口将适用于其他人。我认为猫鼬是select
。
第二个对象是过滤器,例如我不希望_id
在这种情况下我希望与Name
一起返回,并且Name设置为true。
我没有测试过这个,但它应该是您正在寻找的: https://docs.mongodb.com/manual/tutorial/project-fields-from-query-results/#suppress-id-field
Mongo推荐的方法是$projection
https://docs.mongodb.com/manual/reference/operator/aggregation/project/
要在查询中返回的字段。要包含或排除(不是两者)的字段对象,{'a':1}
您的查询将是:
db.collection(collectionName).find({"Name":studentName},{"Courses.Name":studentCourse}).project({ Name: 1, Marks: 1});
会找到名为ECE
的课程,并将Name
与您正在寻找的Marks
一起返回..
答案 1 :(得分:0)
试试这个:
db.collection(collectionName).find({
Name: studentName,
Courses: {
$elemMatch: {
Name: studentCourse
}
}
}, {"Courses.$": 1})
$elemMatch
运算符需要位于过滤器中,而不是投影
答案 2 :(得分:0)