首页 > 解决方案 > 在猫鼬中使用“deleteMany”后中间件

问题描述

在我的 Nodejs 和 Express 应用程序中,我有一个 mongoose 用户模式、一个帖子模式和一个评论模式,如下所示:

const UserSchema = new Schema({
    username: {
        type: String,
        required: true,
        unique: true
    },
    password: String,
    posts : [
        {
            type : mongoose.Schema.Types.ObjectId,
            ref  : 'Post' 
        }
    ]
});


const PostSchema = new Schema({
    author : {
        type : mongoose.Schema.Types.ObjectId,
        ref  : 'User' 
    },
    createdAt: { type: Date, default: Date.now },
    text: String,
    comments : [
        {
            type : mongoose.Schema.Types.ObjectId,
            ref  : 'Comment' 
        }
    ],
});

const CommentSchema = new Schema({
    author : {
        type : mongoose.Schema.Types.ObjectId,
        ref  : 'User' 
    },
    createdAt: { type: Date, default: Date.now },
    text: String
});

我已经为我的用户编写了一般的 CRUD 操作。删除我的用户时,我可以使用deleteMany轻松删除与该用户关联的所有帖子:

Post.deleteMany ({ _id: {$in : user.posts}});

要删除所有已删除帖子的所有评论,我可能可以遍历帖子并删除所有评论,但我在这里查看了 mongoose 文档,似乎deleteMany函数触发了deleteMany 中间件。因此,在我的 Post 模式中,我在定义模式之后和导出模型之前添加了以下内容。

PostSchema.post('deleteMany', async (doc) => {
    if (doc) {
        await Comment.deleteMany({
            _id: {
                $in: doc.comments
            }
        })
    }
})

删除用户时,会触发此中间件,但不会删除评论。我使用console.log(doc)获得了doc的价值,但我认为它不包括我打算做的事情。有人可以告诉我如何正确使用deleteMany中间件,或者如果这不是正确的路径,当我删除用户及其帖子时,删除所有相关评论的最有效方法是什么?

标签: node.jsexpressmongoosemiddlewaremongoose-schema

解决方案


deleteMany不会让您访问受影响的文档,因为它是查询中间件而不是文档中间件(请参阅https://mongoosejs.com/docs/middleware.html#types-of-middleware)。相反,它返回“类似收据”的对象,告诉它成功删除了 n 个对象等。

为了让您的钩子按预期工作,您需要使用除 之外的其他deleteMany内容,例如获取所有文档(或它们的 ID),并使用deleteOne.


推荐阅读