2016-02-09 11 views
6

Voglio iniziare a sfruttare il controllo delle versioni dei documenti Mongooses (__v). Stavo riscontrando un problema che incrementava effettivamente il valore della versione, quindi ho scoperto che è necessario aggiungere this.increment() durante l'esecuzione di una query.Un modo semplice per incrementare le versioni dei documenti Mongoose per qualsiasi query di aggiornamento?

C'è un modo per aumentare automaticamente? Per il momento, ho solo aggiunto al pre middleware per un aggiornamento di tipo query:

module.exports = Mongoose => { 
    const Schema = Mongoose.Schema 

    const modelSchema = new Schema({ 
     name: Schema.Types.String, 
     description: Schema.Types.String 
    }) 

    // Any middleware that needs to be fired off for any/all update-type queries 
    _.forEach([ 'save', 'update', 'findOneAndUpdate' ], query => { 
     // Increment the Mongoose (__v)ersion for any updates 
     modelSchema.pre(query, function(next) { 
      this.increment() 
      next() 
     }) 
    }) 
} 

che sembra funzionare .. Ma io kinda pensato che ci sarebbe già un modo per fare questo all'interno di Mongoose .. ho sbagliato?

risposta

4

Direi che questa è la strada da percorrere. middleware pre si adatta esattamente a questa esigenza e non conosco altro modo. In effetti questo è quello che sto facendo in tutti i miei schemi.

Quello che dovete essere consapevoli di se, è la differenza tra documento e interrogazione middleware. Il documento middleware viene eseguito per operazioni init, validate, save e remove. Lì, this si riferisce al documento:

schema.pre('save', function(next) { 
    this.increment(); 
    return next(); 
}); 

Query middleware vengono eseguiti per count, find, findOne, findOneAndRemove, findOneAndUpdate e update operazioni. Lì, this fa riferimento all'oggetto query. L'aggiornamento del campo versione per tali operazioni sarebbe simile a questa:

schema.pre('update', function(next) { 
    this.update({}, { $inc: { __v: 1 } }, next); 
}); 

Fonte: mongoose documentation.

+0

Quindi stai dicendo che dovrei dividere l'incremento di '__v' tra i metodi di aggiornamento del documento (' save') ei metodi di aggiornamento delle query ('findOneAndUpdate',' update')? Qualcosa come ** [questo] (http://pastebin.com/QGxgLhQz) **? – Justin

+0

Sì, è necessario dividere l'incremento tra il documento e il middleware delle query. Suggerisco di avere 2 metodi diversi come mostrato nel mio post, piuttosto che provare a spremere 2 modi diversi in un unico metodo. – Antoine

+0

FYI @Antoine, la funzione Query MW aveva bisogno del callback "next", che ho scoperto da [questo thread] (http://stackoverflow.com/questions/35540047/incorrect-document-revision-number-found-in- post-update-middleware). Ho aggiornato il tuo post – Justin

Problemi correlati