Mongoose中deleteOne的post回调无法获取文档对象的问题
Mongoose deleteOne post中间件无法获取被删除文档的解决方案
核心原因
Mongoose中deleteOne有两种调用场景,对应post中间件的参数完全不同:
- 文档实例调用(如
doc.deleteOne()):属于document模式,post中间件的参数是被删除的完整文档对象 - 模型直接调用(如
Club.deleteOne({_id: xxx})):属于query模式,post中间件的参数是MongoDB返回的删除结果(即你看到的{acknowledged: true, deletedCount: 1})
你的代码同时开启了document: true和query: true,但实际调用的是模型的deleteOne(query模式),所以回调拿到的是删除结果而非目标文档。
解决方案
根据你的调用场景选择对应写法:
场景1:使用文档实例的deleteOne
保持中间件的document模式配置,先查询获取文档实例再调用deleteOne:
// 配置document模式的post中间件 ClubSchema.post('deleteOne', {document: true}, function(doc) { console.log('被删除的文档ID:', doc._id); }); // 调用方式:先查询文档,再执行删除 const club = await Club.findById(clubId); await club.deleteOne();
场景2:使用模型直接删除并获取文档
如果需要直接通过模型删除并拿到被删除的文档,建议改用findOneAndDelete,它的post中间件会返回被删除的文档:
// 配置findOneAndDelete的post中间件 ClubSchema.post('findOneAndDelete', function(doc) { console.log('被删除的文档ID:', doc._id); }); // 调用方式:直接通过模型执行删除 await Club.findOneAndDelete({_id: clubId});
补充说明
官方文档的示例默认基于文档实例调用deleteOne的场景,所以参数是被删除的文档;而你实际使用的是模型级的query调用,参数为删除结果是符合Mongoose设计逻辑的。
内容的提问来源于stack exchange,提问作者amazinglySK
相关产品推荐
相关产品推荐

