如何使用节点js从mongo获取Record中的特定信息?

时间:2018-03-27 14:32:20

标签: node.js mongodb mongodb-query

{
  "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的完整记录为什么?任何人都可以帮助我如何才能获得选定的课程?

3 个答案:

答案 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)

您的查询将如下所示:

db.course.aggregate([
{$redact:{
   $cond:{
        if:{$eq:["$Name","ECE"]},
        then:"$$PRUNE" ,
        else:"$$DESCEND"
   }    
 }}
])

您可以传递Name字段进行相等检查,它会相应地过滤文档。在上面的示例中,我删除了Courses.NameECE

的所有文档

enter image description here