有一个小新手问题,尽管我找不到类似问题的解决方案,但这对我有用。 这是我的收藏:
{
"_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:如何在设置/推送中使用课程参数?澄清一下Q2,我并不懒惰,我尝试了很多方法,但没有一种奏效,请帮忙!
你可以试试下面的查询。这把6
推到了IABD
db.getCollection('students').update( { "index": "123456" }, { $push: { "grades.IABD" : 6 } });
$push
没有按预期的方式工作,因为数组字段位于嵌入式文档中,并且需要使用推送 点表示法,即代替
{ "$push": { "grades" : { "IABD" : grade } } }
您需要将字段指定为点表示法
{ "$push": { "grades.IABD" : grade } }
要在推送中使用 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 }
);
}