2017-10-03 4 views
0

J'ai un schéma mangouste qui ressemble à ceci:Comment marquer un élément spécifique d'un tableau de sous-document tel que modifié dans mongoose?

let ChildSchema = new Schema({ 
    name:String 
}); 

ChildSchema.pre('save', function(next){ 
    if(this.isNew) /*this stuff is triggered on creation properly */; 
    if(this.isModified) /* I want to trigger this when the parent's name changes */; 
    next(); 
}); 

let ParentSchema = new Schema({ 
    name: String, 
    children: [ChildSchema] 

}); 

Les choses isNew fonctionne comme prévu, mais je veux marquer les éléments du tableau réel de children tel que modifié de sorte que la substance isModified est déclenchée à tout moment les changements de nom du parent . Je ne suis pas sûr de savoir comment faire ça.

J'ai essayé:

ParentModel.findById(id) 
    .then((parentDocument) => { 
     parentDocument.name = 'mommy'; //or whatever, as long as its different. 
     if(parentDocument.isModified('name')){ 
      //this stuff is executed so I am detecting the name change. 
      parentDocument.markModified('children');//probably works but doesn't trigger isModified on the actual child elements in the array 
      for(let i=0; i < parentDocument.children.length; i++){ 
       parentDocument.markModified('children.'+i);//tried this as I thought this was how you path to a specific array element, but it has no effect. 
      } 
      parentDocument.save();//this works fine, but the child elements don't have their isModified code executed in the pre 'save' middleware 
     } 
    }); 

Ma question - comment les éléments du tableau ne vous marquer spécifiques (ou tous) d'un sous-document tel que modifié de sorte que leur propriété isModified sera vrai? Notez que mon intergiciel de pré-sauvegarde est bien exécuté, mais aucun des éléments n'a isModified === true;

Répondre

0

Il s'avère que la méthode markModified est disponible sur l'enfant lui-même (bien que j'utilise TypeScript, j'ai été induit en erreur par les informations de typage données).

Donc, si je fais ceci:

ParentModel.findById(id) 
    .then((parentDocument) => { 
     parentDocument.name = 'mommy'; //or whatever, as long as its different. 
     if(parentDocument.isModified('name')){ 
      for(let child of parentDocument.children){ 
       child['markModified']('name'); 
      } 
      parentDocument.save(); 
     } 
    }); 

Il fonctionne. Notez que si je tente de marquer juste l'enfant lui-même comme modifié comme suit:

child['markModified'](); 

j'obtiens l'erreur:

MongoError: cannot use the part (children of children.{ name: 'theName'}) to traverse the element <bla bla bla> 

Je ne sais pas pourquoi c'est le cas, mais il ne question, dans mon cas ayant un certain champ marqué comme modifié est très bien. Serait bon de savoir pourquoi l'erreur traverse se lève, mais mon problème est résolu.