Использование $ pull внутри цикла, возвращающего нуль-Монго / Мангуст - PullRequest
0 голосов
/ 20 января 2019

для двух моделей мангустов, имеющих поле со встроенными документами, на которые ссылается 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.

Как я могу заставить эту работу работать правильно.

Заранее большое спасибо!

...