如何使用Mongoose删除关联数据?MirFile删除时关联MirSubFile未同步删除问题求助
解决Mongoose
pre('remove') 钩子不生效的问题 我看到你的问题了,pre('remove')钩子没生效主要有两个核心原因,咱们一步步拆解解决:
1. 模型编译顺序错误(最常见的坑)
你当前的代码是先创建MirFile模型,再给Schema添加钩子——但Mongoose在调用mongoose.model()时就会编译Schema,之后再添加的中间件不会被应用到已编译的模型上。必须先定义好所有中间件,再创建模型。
修正后的MirFile Schema代码如下:
const mongoose = require("mongoose"); const {ObjectId} = mongoose.Schema // 1. 先定义Schema结构 const MirFileSchema = new mongoose.Schema({ createdAt: { type: Date, default: Date.now, }, name: { type: String, required: [true, "Uploaded file must have a name"], }, image:{ type:String }, belongsTo:{ type:ObjectId, ref:"MirFolder" } }); // 2. 先添加pre钩子(确保MirSubFile模型已注册/引入) MirFileSchema.pre('remove', function(next) { // 用mongoose.model获取已注册的MirSubFile模型,避免引入顺序问题 const MirSubFile = mongoose.model("MirSubFile"); MirSubFile.remove({belongsTo: this._id}).exec(); next(); }); // 3. 最后编译并导出模型 const MirFile = mongoose.model("MirFile", MirFileSchema); module.exports = MirFile;
另外,你的MirSubFile模型导出变量名也是File,容易引发命名冲突,建议修正:
// MirSubFileSchema的最后部分 const MirSubFile = mongoose.model("MirSubFile", MirSubFileSchema); module.exports = MirSubFile;
2. 错误的删除方法导致钩子不触发
pre('remove')是文档级中间件,只有调用文档实例的remove()方法时才会触发。如果你用的是模型级别的删除方法(比如deleteOne/findByIdAndDelete),这些方法直接操作数据库,不会触发文档中间件。
解决方式二选一:
方式一:改用文档实例删除
先获取文档对象,再调用remove():
const targetFile = await MirFile.findById(fileId); if (targetFile) { await targetFile.remove(); // 此时会触发pre('remove')钩子 }
方式二:添加模型级中间件(适配批量/直接删除)
如果不想修改业务代码的删除逻辑,可以针对模型级删除方法添加中间件:
// 针对findByIdAndDelete、findOneAndDelete的中间件 MirFileSchema.pre('findOneAndDelete', async function(next) { const fileId = this.getQuery()._id; await mongoose.model("MirSubFile").deleteMany({belongsTo: fileId}); next(); }); // 针对deleteOne的中间件(需指定query模式) MirFileSchema.pre('deleteOne', { document: false, query: true }, async function(next) { const fileId = this.getQuery()._id; await mongoose.model("MirSubFile").deleteMany({belongsTo: fileId}); next(); });
这样不管用findByIdAndDelete还是deleteOne,都会自动删除关联的MirSubFile文档。
内容的提问来源于stack exchange,提问作者Shehryar Tanoli
相关产品推荐
相关产品推荐

