我刚刚发现从 this SO 中不推荐使用 remove ,但我似乎找不到任何其他来源来确认它。阅读 this 后我仍然很迷茫,因为即使我理解文档和查询中间件之间的区别。但是,在文档中,它特别提到如果我要使用 findOneAndDelete,例如,它会触发 findOneAndDelete 中间件。这是否意味着我必须像这样使用它:
schema.pre('findOneAndDelete', function(next) {
// do stuff
next();
});
或者我可以这样做:
schema.pre('deleteOne', function(next) {
// do stuff
next();
});
文档和查询命令是否需要单独的预挂钩?
实现级联删除最有效的方法是什么?我假设当我知道即使在我只返回一个匹配项的情况下也只使用 deleteMany 时,它至少总是会触发 deleteMany 中间件,因此我不必为 deleteOne 编写另一个钩子。
我还没有重构我的代码以使用 deleteOne,但这是我到目前为止所拥有的,并且订单项目没有被删除。
来自解析器:
const category = await Category.findById(id);
category.remove();
来自类别架构:
categorySchema.pre('remove', async () => {
await Item.deleteMany({ _id: this._id }).exec();
await OrderItem.deleteMany({ item: this._id }).exec();
});
来自订单项架构:
const orderItemSchema = Schema({
item: {
type: Schema.Types.ObjectId,
ref: 'Item',
},
price: {
type: String,
required: true,
trim: true,
},
});