You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Mongoose的pre deleteOne中触发另一模型的pre deleteMany钩子

解决方案

错误原因

  • 所有钩子中存在**重复调用next()**的问题:你既将next作为数据库操作的回调参数,又单独执行了next(),会导致异步删除操作还未完成就提前进入后续流程,同时多次调用next也会引发Mongoose内部流程异常
  • Unit模型的deleteMany是查询钩子,上下文this指向查询对象而非文档实例,不存在this._id属性,导致你删除Entry的筛选条件完全无效

修复后代码

推荐统一使用async/await写法,不需要手动管理next调用,逻辑更清晰不易出错:

1. Site模型修复

SiteSchema.pre("deleteOne", { document: true, query: false }, async function () {
  // 删除当前站点关联的所有Unit
  await this.model("Unit").deleteMany({ site: this._id });
});

2. Unit模型修复

UnitSchema.pre("deleteMany", async function () {
  // 获取当前deleteMany操作的查询条件,查出所有要删除的Unit的ID
  const unitsToDelete = await this.model.find(this.getFilter()).select("_id");
  const unitIdList = unitsToDelete.map(item => item._id);
  // 批量删除这些Unit关联的所有Entry
  await this.model("Entry").deleteMany({ unit: { $in: unitIdList } });
});

修改后触发Site删除操作时,会按预期顺序执行:删除关联Entry → 删除关联Unit → 删除Site本身。


内容的提问来源于stack exchange,提问作者Bynx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 04:06:03