如何在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
相关产品推荐
相关产品推荐

