2016-02-09 24 views
6

Chcę zacząć korzystać z wersjonowania dokumentów Mongooses (klucz __v). Wystąpił problem powodujący zwiększenie wartości wersji, a następnie stwierdziłem, że podczas wykonywania zapytania trzeba dodać this.increment().Łatwy sposób zwiększania wersji dokumentów Mongoose dla jakichkolwiek zapytań aktualizacji?

Czy istnieje sposób na automatyczne zwiększenie inkrementacji? Na razie, po prostu dodaje się go do pre middleware przez zapytaniami zmiana typu:

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

co wydaje się pracować .. Ale trochę myśli nie byłoby już sposób to zrobić w ciągu Mongoose .. czy się mylę?

Odpowiedz

4

Powiedziałbym, że to jest droga. pre- middleware pasuje dokładnie do tej potrzeby i nie znam innego sposobu. W rzeczywistości to właśnie robię we wszystkich moich schematach.

Należy jednak pamiętać o różnicy między oprogramowaniem , dokumentem a zapytaniem oprogramowanie pośredniczące. Oprogramowanie pośrednie dokumentu jest wykonywane dla operacji , validate, save i remove. Tam this odnosi się do dokumentu:

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

Zapytanie middleware są wykonywane dla count, find, findOne, findOneAndRemove, findOneAndUpdate i update operacji. Tam, this odnosi się do obiektu zapytania. Aktualizacja polu Wersja dla takich operacji będzie wyglądać następująco:

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

Źródło: mongoose documentation.

+0

Więc mówisz, że musiałbym podzielić przyrost "__v' między metodami aktualizacji dokumentu (' zapisz') i metodami aktualizacji zapytań ('findOneAndUpdate',' update')? Coś jak ** [this] (http://pastebin.com/QGxgLhQz) **? – Justin

+0

Tak, musisz podzielić inkrementację między dokumentem a oprogramowaniem pośredniczącym. Proponuję dwie różne metody, jak pokazano w moim poście, zamiast próbować wycisnąć 2 różne sposoby w jednej metodzie. – Antoine

+0

FYI @Antoine, funkcja Query MW wymagała wywołania zwrotnego 'next', o którym dowiedziałem się z [tego wątku] (http://stackoverflow.com/questions/35540047/incorrect-document-revision-number-found-in- post-update-middleware). Zaktualizowałem twój wpis – Justin