如何在mongoDB数据库的Multilevel结构中插入新条目?

时间:2017-11-22 08:09:30

标签: arrays mongodb mongoose mongodb-query

我正在开发一个应用程序,其中包含mongoDB数据库多级结构中学年的详细信息。

为此,我创建了这样的结构:

$ cat .htaccess
ModPagespeed Off

现在,在同一学年和同一个系,我想在学期数组中创建一个新的学期节点。为此,我尝试了$和$的语法。运营商,但它运作不佳。如何在该学期数组中添加新的学期节点?在创建新的学期节点之后,如何在类数组中添加新类?

1 个答案:

答案 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();
          });  

      });