2016-02-09 6 views
6

Ich möchte beginnen, Vorteile von Mongooses Dokument Versionierung (__v Schlüssel) zu nutzen. Ich hatte ein Problem, das den Versionswert tatsächlich inkrementiert, dann habe ich festgestellt, dass Sie this.increment() hinzufügen müssen, wenn Sie eine Abfrage ausführen.Einfache Möglichkeit, Mongoose-Dokumentversionen für alle Aktualisierungsabfragen zu erhöhen?

Gibt es eine Möglichkeit, automatisch inkrementiert zu werden? Vorerst habe ich es nur auf die pre Middleware für eine Update-Typ-Abfragen:

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

Welche scheint zu funktionieren .. Aber ich dachte, irgendwie schon da ein Weg wäre, dies innerhalb Mongoose zu tun .. Liege ich falsch?

Antwort

4

Ich würde sagen, das ist der Weg zu gehen. vor Middleware passt genau dieses Bedürfnis, und ich kenne keinen anderen Weg. Genau das mache ich in all meinen Schemata.

Was Sie sich bewusst, obwohl sein müssen, ist der Unterschied zwischen Dokument und Abfrage Middleware. Dokument Middleware werden für init, validate, save und remove Operationen ausgeführt. Es bezieht sich this auf das Dokument:

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

Abfrage Middleware ausgeführt werden für count, find, findOne, findOneAndRemove, findOneAndUpdate und update Operationen. Dort bezieht sich this auf das Abfrageobjekt. Aktualisieren der Versionsfeld für solche Operationen aussehen würde wie folgt aus:

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

Quelle: mongoose documentation.

+0

Sie sagen also, ich müsste die '__v'-Inkrementierung zwischen den Dokumentupdate-Methoden ('save') und den Abfrage-Update-Methoden (' findOneAndUpdate', 'update') aufteilen? So etwas wie ** [this] (http://pastebin.com/QGxgLhQz) **? – Justin

+0

Ja, Sie müssen die Inkrementierung zwischen Dokumenten- und Abfrage-Middlewares aufteilen. Ich schlage vor, zwei verschiedene Methoden zu verwenden, wie in meinem Beitrag gezeigt, anstatt zu versuchen, zwei verschiedene Methoden in einer einzigen Methode zu verwenden. – Antoine

+0

FYI @Antoine, die Query MW-Funktion benötigt den 'nächsten' Callback, den ich aus [diesem Thread] herausgefunden habe (http://stackoverflow.com/questions/35540047/incorrect-document-revision-number-found-in- Post-Update-Middleware). Ich habe deinen Beitrag aktualisiert – Justin

Verwandte Themen