在猫鼬中更新嵌套数组

时间:2018-07-04 17:45:01

标签: mongoose

课程架构

Course
  name: String,
  code: String,
  sections: [
    reference: Number,
    professor: String,
    students: [
      id: ObjectId
    ]
  ]

有很多课程,每个课程都有很多部分,每个课程都有很多学生。

假设用户的输入是数据库中存在的一组参考值,那么我如何才能按引用查找部分并将用户的ID添加到students数组中?

这是我目前拥有的,但是它不起作用,并且我也没有收到任何错误:

Course.update(
        { sections: { $elemMatch: { reference: references[i] } } },
        { $addToSet: { students: userId } },
        { new: true, upsert: true },
        function (err, sectionAdded) {
            if (err) {
                console.error('saving references error');
                return res.status(500).send({ message: 'saving references error' });
            }
        });

1 个答案:

答案 0 :(得分:0)

您可以使用$elemMatch通过一系列嵌入式文档进行查找:

Course.static({
  findOneBySectionReferences (references) {
    return this.findOne({
      sections : {
        $elemMatch : {
          reference : {$in : references}
        }
      }
    });
  }
})

function addUserId (userId, references) {
  return (
    Course.findOneBySectionReferences(references).exec()
          .then((course) => {
            course.sections.forEach((section) => {
              references.forEach((reference) => {
                if (section.reference === reference) {
                  section.students.push({id : userId});
                }
              });
            });
            return course.save();
          })
  );
}

addUserId(userId, references)
.then((updatedCourse) => {
  console.log('Updated');
});