MongoDB使用嵌套位置的参数



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

{
"_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 } 
);
}

最新更新