Mongoose - 如何使用预挂钩删除进行级联删除

Mongoose - How to cascade delete using pre hook remove

我有一个 moment 架构,可以关联多个评论。当某个时刻被删除时,我希望与该时刻相关的所有评论也被删除。

瞬间架构

let MomentSchema = new Schema({

    body: String,
    likes: [{
        type: Schema.Types.ObjectId,
        ref: 'User',
    }],
    dislikes: [{
        type: Schema.Types.ObjectId,
        ref: 'User',
    }],
    comments: [{
        type: Schema.Types.ObjectId,
        ref: 'Comment',
    }],
    author: {
        type: Schema.Types.ObjectId,
        ref: 'User',
    },

},
    {
        timestamps: {createdAt: 'created_at', updatedAt: 'updated_at'},
    });

MomentSchema.pre('remove', (next) => {

//What to include here to delete all the comments for this moment

});

仅供参考,评论也可以有回复,这也是评论模型,因此我还需要评论模型中的预删除挂钩吗?

评论架构

let CommentSchema = new Schema({

    body: {
        type: String,
        required: true,
    },
    moment: {
        type: Schema.Types.ObjectId,
        ref: 'Moment',
    },
    author: {
        type: Schema.Types.ObjectId, ref: 'User',
        required: true,
    },
    likes: [{
        type: Schema.Types.ObjectId,
        ref: 'User',
    }],
    dislikes: [{
        type: Schema.Types.ObjectId,
        ref: 'User',
    }],
    parent: {
        type: Schema.Types.ObjectId, 
        ref: 'Comment',
    },
    replies: [{
        type: Schema.Types.ObjectId,
        ref: 'Comment',
    }],

},
    {
        timestamps: {createdAt: 'created_at', updatedAt: 'updated_at'},
    });

API 删除:moment/:id

 destroy(req, res) {

        let id = req.params.id;

        Moment.findOne({'_id': id}, (err, moment) => {

            if (err) {

                return res.status(404).json({

                    success: false,
                    status: 404,
                    data: {},
                    message: 'Failed to find moment',

                });

            }

            moment.remove((err, moment) => {

                if (err) {
                    return res.status(400).json({
                        success: false,
                        status: 400,
                        data: err,
                        message: 'Failed to delete moment',
                    });
                }

                return res.status(200).json({

                    success: true,
                    status: 200,
                    data: {},
                    message: 'Successfully deleted moment',

                });

            });


        });

}

我需要在pre-hook中删除什么才能删除与该时刻相关的所有评论。此外,在预挂钩中调用 "this" 时将其删除 returns undefined.

因此,要删除所有评论 && 多级联,我必须在文档上调用 .remove 方法。将下面的代码插入 moment pre-hook remove 函数后,它将在删除 moment 之前删除评论。

此外,在删除评论之前,它会调用评论预挂钩。我可以在哪里添加代码以删除对每条评论的回复。

 Comment.find({'moment': this._id})
        .then((comments) => {
            Promise.all(comments.forEach((comment) => comment.remove()))
                .then(next());
        });

这里使用了promise.all,因为我们只想删除所有评论后的那一刻