2016-09-09 1 views
1

J'essaie d'obtenir le middleware 'remove' qui fonctionne sur mongoose.Middleware en cascade de Mongoose, plusieurs niveaux

J'ai une base de données si j'ai:

'modules' -> 'modulesInst' -> 'assignments' -> 'studentAssignments' 

Ainsi, lorsque les modules supprimer, il cascade de modulesInst ', et quand modulesInst supprime supprime' affectations de connexes, puis la même chose avec « les devoirs des élèves » .

Le problème est que je peux seulement le faire fonctionner à un niveau.

schéma de niveau supérieur et 'supprimer' middleware (module)

var modulesSchema = new Schema (
     { 
      _id: Number, 
      moduleName: String, 
      moduleLeader: String 
     } 
    ); 

modulesSchema.pre('remove', function(next){ 
    modulesInst.remove({modID: this._id}).exec(); 
    next(); 
}); 

schéma de second niveau et 'Supprimer' middleare (moduleInst) [où le middleware cesse de cascade]

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(); 
}); 

troisième niveau de schéma et middleware 'remove' (affectation) [le middleware ne se déclenche pas aussi bien]

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(); 
}); 

Y at-il une astuce simple qui me manque pour rester en cascade? Comme la documentation n'est pas claire et ne peut pas trouver d'exemples.

Répondre

0

Model.remove() La méthode ne déclenche pas le middleware. À partir du docs:

Remarque: Il n'y a aucun hook de requête pour remove(), uniquement pour les documents. Si vous définissez un hook 'remove', il sera déclenché lorsque vous appellerez myDoc.remove(), et non lorsque vous appellerez MyModel.remove().

Cela dit, vous devez le faire au niveau du document, par exemple (en utilisant les promesses de bluebird):

modulesInt 
    .find({ modID: this._id }) 
    .then((modules) => Promise.each(modules, (module) => module.remove())) 
    .then(next) 
    .catch(next)