MongoDB使用参数来嵌套位置

时间:2018-10-17 10:58:48

标签: javascript mongodb parameters nested location

有一个新手问题,尽管我找不到类似问题的解决方案,这对我很有用。 这是我的收藏集:

{
   "_id": ObjectId("5bc712851224ceec702d9bdf"),
   "index": "123456",
   "name": "Jan",
   "surname": "Nowak",
   "grades": {
     "IABD": [
       2,
       3.5,
       4 
    ],
     "NPAD": [
       4,
       4,
       5 
    ] 
  } 
}

现在我需要为特定的(功能参数)课程增加其他成绩。

所以我尝试在几个层面上解决它,我很乐意按照以下方法逐步指导我: 首先,我想成功不通过课程作为参数:

function add_grade(index="123456", course="IABD", grade=5.5) 
{
db.students.update( {"index" : index }, { $push: { "grades" : { "IABD" : grade } } } );
}

好吧,什么都没发生(成绩未添加到成绩列表中) 我想看到一些结果,所以我想看看$ set是否可以正常工作!

function add_grade(index="123456", course="IABD", grade=5.5) 
{
db.students.update( {"index" : index }, { $set: { "grades" : { "IABD" : grade } } } );
}

但是它扔掉了我所有的成绩对象(如预期)。至少我知道我在正确的轨道上。 问题1:为什么$ push无法按我预期的方式运行

问题2:如何在set / push中使用课程参数? 只是为了澄清第二季度,我并不懒惰,我尝试了许多方法,但都没有用,请帮忙!

2 个答案:

答案 0 :(得分:0)

您可以尝试以下查询。将6推入IABD

db.getCollection('students').update( { "index": "123456" }, { $push: { "grades.IABD" :  6 } });

答案 1 :(得分:0)

$push不能按您期望的方式工作,因为array字段位于嵌入式文档中,因此您需要使用 dot notation,即代替

{ "$push": { "grades" : { "IABD" : grade } } }

您需要将字段指定为dot notation

{ "$push": { "grades.IABD" : grade } } 

要在push中使用Course参数,您需要创建一个包含点符号的更新对象

{ "grades.<course>" : grade }

例如

var course = "IABD";
var grade = 5.5;
var update = {};
update["grades." + course] = grade;
printjson(update) // prints { "grades.IABD" : 5.5 }

所以您的函数看起来像

function add_grade(index="123456", course="IABD", grade=5.5) {
    var update = {};
    update["grades." + course] = grade;
    db.students.update( 
        { "index" : index }, 
        { "$push": update } 
    );
}