我正在努力让'删除'中间件工作在mongoose上。
我有一个数据库,我有:
'modules' -> 'modulesInst' -> 'assignments' -> 'studentAssignments'
因此,当模块删除时,它会级联'modulesInst',当modulesInst删除时,它会删除相关的“赋值”,然后与“学生分配”相同。
问题是我只能让它在一个层面上运作。
顶级架构和'删除'中间件(模块)
var modulesSchema = new Schema (
{
_id: Number,
moduleName: String,
moduleLeader: String
}
);
modulesSchema.pre('remove', function(next){
modulesInst.remove({modID: this._id}).exec();
next();
});
二级架构和'删除'middleare(moduleInst)[中间件停止级联]
var modulesInstSchema = new Schema (
{
year: Number,
semester: String,
modID: [{ type: Schema.Types.Number, ref: 'Module' }],
}
);
modulesInstSchema.pre('remove', function (next) {
assignment.remove({modInsID: this._id}).exec();
next();
});
架构的第三级和'删除'中间件(赋值)[中间件不会触发]
var assignmentSchema = new Schema (
{
code: String,
assignName: String,
modInsID: [{ type: Schema.Types.Number, ref: 'ModuleInst' }],
}
);
assignmentSchema.pre('remove', function (next) {
studentAssign.remove({assID: this._id}).exec();
next();
});
我是否缺少一个简单的技巧来保持级联?由于文档不清楚,无法找到示例。
答案 0 :(得分:2)
Model.remove()
方法不会触发中间件。来自docs:
注意:remove()没有查询挂钩,仅适用于文档。如果你设置了一个'删除'钩子,当你调用myDoc.remove()时它会被触发,而不是在你调用MyModel.remove()时触发。
也就是说,您必须在文档级别执行此操作,例如(使用bluebird的承诺):
modulesInt
.find({ modID: this._id })
.then((modules) => Promise.each(modules, (module) => module.remove()))
.then(next)
.catch(next)