Mongoose Pre Hook - 查询与文档; findOneAndDelete 与 deleteOne

时间:2021-01-19 06:51:54

标签: mongodb mongoose

我刚刚发现从 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,
  },
});

0 个答案:

没有答案
相关问题