Mongoose级联中间件,多层次

时间:2016-09-09 10:14:34

标签: node.js mongodb mongoose

我正在努力让'删除'中间件工作在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();
});

我是否缺少一个简单的技巧来保持级联?由于文档不清楚,无法找到示例。

1 个答案:

答案 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)