有一个新手问题,尽管我找不到类似问题的解决方案,这对我很有用。 这是我的收藏集:
{
"_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中使用课程参数? 只是为了澄清第二季度,我并不懒惰,我尝试了许多方法,但都没有用,请帮忙!
答案 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 }
);
}