node.js - 在猫鼬中使用“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中间件,或者如果这不是正确的路径,当我删除用户及其帖子时,删除所有相关评论的最有效方法是什么?
解决方案
deleteMany
不会让您访问受影响的文档,因为它是查询中间件而不是文档中间件(请参阅https://mongoosejs.com/docs/middleware.html#types-of-middleware)。相反,它返回“类似收据”的对象,告诉它成功删除了 n 个对象等。
为了让您的钩子按预期工作,您需要使用除 之外的其他deleteMany
内容,例如获取所有文档(或它们的 ID),并使用deleteOne
.
推荐阅读
- python - 在 Windows 提示符下运行时出现 Python SyntaxError
- python - Python函数及操作
- aem - 在 Slightly 的条件元素中包装标记?
- c# - 从打开的 DataReader 中返回一个新对象 - 好不好?
- java - 在 Java 中使用 Hibernate 加入嵌入式 ID 列
- python - libvips / pyvips 访问多通道 tiff (OME-Tiff) 的一小部分
- python - 在函数 2 中使用函数 1 创建的 pandas 数据框?
- visual-studio-code - VSCode + 远程 WSL 某些功能不起作用
- python - 如何使用 python 从网站上抓取段落?
- java - 多态性实现对子字段的强制通用更改