我正在开发一个应用程序,其中包含mongoDB数据库多级结构中学年的详细信息。
为此,我创建了这样的结构:
$ cat .htaccess
ModPagespeed Off
现在,在同一学年和同一个系,我想在学期数组中创建一个新的学期节点。为此,我尝试了$和$的语法。运营商,但它运作不佳。如何在该学期数组中添加新的学期节点?在创建新的学期节点之后,如何在类数组中添加新类?
答案 0 :(得分:0)
可以通过位置运算符$ []完成,
db.collection.update(
{ "academicyear": "2016-2017", "departments.deptname": "computer"},
{ "$push":
{"departments.$[].semesters":
{
"sem" : "2",
"classes" : [ ...
}
}
}
)
也可以通过指示数组中的位置(如果已知)来完成。 “ departments.1.semesters”,其中1是“部门”在数组中的位置。
db.collection.update(
{ "academicyear": "2016-2017"},
{ "$push":
{"departments.1.semesters":
{
"sem" : "2",
"classes" : [ ...
}
}
}
)
一种实现方法是:
var toInsert = {"sem" : "2", "classes" : [ ... }
db.collection.update(
{ "academicyear": "2016-2017", departments: { $elemMatch: { deptname: "computer" } } },
{ $addToSet: { 'departments.$.semesters': toInsert } }
)
查询部分将从id = 2的列表数组中找到文档。然后,我们使用$ positional元素在该数组索引处添加一个新元素。
,同样适用于课程。
db.collection.update(
{ "academicyear": "2016-2017"},
{ "$push":
{"departments.1.semesters.0.classes":
{
"class" : "1",
"theory" : [{ ...
}
}
}
)
另一种选择是提取文档,对返回的对象进行更新,然后再次保存。
db.collection.findOne({"academicyear": "2016-2017", "departments.deptname": "computer"}, {'departments.semesters': 1}, (err, doc) => {
if(err) return handleError(res)(err);
if(!doc) return res.send(404).end();
//I guess semester is 0, but you can find the one that you are going to update by some filter
doc.departments[0].semesters[0].classes.push({...});
doc.save( (err) => {
if(err) return handleError(res)(err)
return res.status(200).end();
});
});