删除嵌套对象引用猫鼬

remove nested object references mongoose

我的申请中有几个猫鼬模型 - 作业、提交和文件。

var assignmentSchema = new Schema({
    submissions:[{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Submission'
    }]
});

var submissionSchema = new Schema({
    assignment: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Assignment'
    },
    files: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'File'
    }],
})

var fileSchema = new Schema({
    submission: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Submission'
    }
})

我为作业定义了一个删除挂钩,因此当作业从我的 mongodb 中删除时,所有提交的内容也会被删除。

assignmentSchema.pre('remove', function (next) {
    var assignment = this;

    assignment.model('Class').update(
        {_id: {$in: assignment.classes}},
        {$pull: {assignments: assignment._id}},
        {multi: true},
        next
    );

    //will delete all submissions that were in the assignment
    assignment.model('Submission').remove(
        {_id: {$in: assignment.submissions}}).exec();
        next
});

它工作正常,但我还想删除与已删除提交相关的所有文件。我怎样才能做到这一点?

您必须为提交的文件设置预删除挂钩。
然后在您的 assignmentSchema 循环中遍历 assignment.submissions 数组,找到每个分配文档并对该文档执行删除。 这是一个例子。未测试。

assignmentSchema.pre('remove', function(nextAction) {
    var assignment = this;

    assignment.model('Class').update({
            _id: {
                $in: assignment.classes
            }
        }, {
            $pull: {
                assignments: assignment._id
            }
        }, {
            multi: true
        },
        next
    );

    Async.each(assignment.submissions, function(subId, next) {
        submissionSchema.findById(subId).exec(function(err, submission) {
            submission.remove();
            next();
        })
    }, function() {
        nextAction();
    })
});



submissionSchema.pre('remove', function (next) {
///remove files here.
})