для двух моделей мангустов, имеющих поле со встроенными документами, на которые ссылается ObjectId:
//Student.js
module.exports = new Schema({
name: {
type: String,
required: true
},
documentId: {
type: String,
required: true,
unique: true
},
courses: [
{
type: ObjectId,
ref: 'Courses',
required: true
}
]})
//Course.js
module.exports = new Schema({
name: {
type: String,
required: true
},
students: [
{
type: ObjectId,
ref: 'Students'
}
]})
Я хочу удалить из массива Course.students указанный ObjectId студента, как только я удалю Студента.Для этой цели я написал следующее:
removeStudent(documentId) {
return Promise.resolve()
.then(() => {
return Students.findOne({ documentId })
})
.then(student => {
if (!student) throw Error('student does not exist')
const coursesToBePulled = student.courses.toString().split(',')
const studentMongoId = student._id.toString()
async function updateStudentInCourses (coursesToBePulled, studentMongoId) {
for (const item in coursesToBePulled) {
await Courses.findByIdAndUpdate(coursesToBePulled[item], { $pull: {'students': studentMongoId}}, {'new': true})
}
return Students.deleteOne({ documentId })
}
return updateStudentInCourses (coursesToBePulled, studentMongoId)
})
}
Проблема в том, что когда я использую findByIdAndUpdate - $ pull внутри цикла, он отлично работает только на первой итерации.Для других итераций вместо извлечения ссылочного идентификатора он помещает нуль в массив Courses.students.После удаления студента я получаю этот документ:
{
"_id" : ObjectId("5c4443f45c8c1d110671f7ed"),
"students" : [
null
],
"name" : "curs 2",
"__v" : 0
}
Итак, подведем итоги: если на студента ссылаются на 3 курса, то при удалении студента он удаляется только изCourses.students в первой итерации, в двух других итерациях он помещает нуль в Courses.students.
Как я могу заставить эту работу работать правильно.
Заранее большое спасибо!