Обновление вложенного массива в Mongoose - PullRequest
0 голосов
/ 04 июля 2018

Схема курса

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

Есть много курсов, каждый из которых имеет много разделов, в каждом из которых много студентов.

Предполагая, что вводимые пользователем данные являются массивом эталонных значений, которые существуют в базе данных, как я могу найти раздел по ссылке и добавить идентификатор пользователя в массив студентов?

Это то, что у меня сейчас есть, но оно не работает, и я тоже не получаю никаких ошибок:

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 голосов
/ 04 июля 2018

Вы можете использовать $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');
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...