在 mongoose 中删除评论 parents
Delete comment parents in mongoose
我正在使用 typegoose 和 type-graphql。
我有一个 CommentModel
,它有一个 parentId
字段,用于存储其 parent 评论的 ObjectId。
我想要什么?
我想使用 pre
中间件自动删除 parents。意味着当我删除评论时,我希望它删除所有 parentId
等于目标评论 ID 的评论。
例子:
所以,当我删除评论 2 时,我希望评论 1 也会被删除。
comment: [
{
_id: 1,
parentId: 2
},
{
_id: 2,
parentId: null
}
]
但是我不能。
我做了什么?
这是我的中间件:
@pre(/remove|delete/i, async function () {
await CommentModel.deleteMany({ parentId: this._id })
})
export class Comment {
...
}
export const CommentModel = getModelForClass(Comment)
这就是我删除的方式
await CommentModel.findByIdAndDelete(ID_OF_COMMENT)
此操作永远不会完成。并始终向我展示加载微调器。
你有什么建议?我做错了吗?或者有更好的方法?
每个中间件都有一个下一个函数来继续像这样改变它:
@pre(/remove|delete/i, async function (next) {
await CommentModel.deleteMany({ parentId: this._id })
next();
})
我是这样修复的:
@post(/remove|delete/i, async function (comment: DocumentType<Comment> | null) {
if (comment?._id) {
const children = await CommentModel.find({ parentId: comment._id }).lean().exec()
await CommentModel.deleteMany({ parentId: comment._id })
if (children) {
await Promise.all(children.map(child => child?._id && CommentModel.deleteMany({ parentId: child._id })))
}
}
})
我正在使用 typegoose 和 type-graphql。
我有一个 CommentModel
,它有一个 parentId
字段,用于存储其 parent 评论的 ObjectId。
我想要什么?
我想使用 pre
中间件自动删除 parents。意味着当我删除评论时,我希望它删除所有 parentId
等于目标评论 ID 的评论。
例子:
所以,当我删除评论 2 时,我希望评论 1 也会被删除。
comment: [
{
_id: 1,
parentId: 2
},
{
_id: 2,
parentId: null
}
]
但是我不能。
我做了什么?
这是我的中间件:
@pre(/remove|delete/i, async function () {
await CommentModel.deleteMany({ parentId: this._id })
})
export class Comment {
...
}
export const CommentModel = getModelForClass(Comment)
这就是我删除的方式
await CommentModel.findByIdAndDelete(ID_OF_COMMENT)
此操作永远不会完成。并始终向我展示加载微调器。 你有什么建议?我做错了吗?或者有更好的方法?
每个中间件都有一个下一个函数来继续像这样改变它:
@pre(/remove|delete/i, async function (next) {
await CommentModel.deleteMany({ parentId: this._id })
next();
})
我是这样修复的:
@post(/remove|delete/i, async function (comment: DocumentType<Comment> | null) {
if (comment?._id) {
const children = await CommentModel.find({ parentId: comment._id }).lean().exec()
await CommentModel.deleteMany({ parentId: comment._id })
if (children) {
await Promise.all(children.map(child => child?._id && CommentModel.deleteMany({ parentId: child._id })))
}
}
})