2016-02-09 4 views
6

Я хочу начать пользоваться версией документа Mongooses (__v key). У меня возникла проблема, фактически увеличивающая значение версии, тогда я обнаружил, что при выполнении запроса вы должны добавить this.increment().Легкий способ увеличения версий документов Mongoose для любых запросов на обновление?

Есть ли способ автоматического увеличения? На данный момент, я просто добавил его к предварительно промежуточного слоя в течение запросов обновления типа:

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

который, кажется, работает .. Но я своего рода думал, что уже быть способ сделать это в Мангуста .. Я ошибаюсь?

ответ

4

Я бы сказал, что это путь. pre middleware соответствует именно этой потребности, и я не знаю другого пути. На самом деле это то, что я делаю во всех своих схемах.

Что вам нужно знать, хотя, разница между документа и запроса промежуточного программного обеспечения. Документ промежуточное программное обеспечение выполнено для init, validate, save и remove операции. Там, this относится к документу:

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

Запрос промежуточного программного обеспечения выполняются для count, find, findOne, findOneAndRemove, findOneAndUpdate и update операций. Там this ссылается на объект запроса. Обновление поля версии для таких операций будет выглядеть следующим образом:

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

Источник: mongoose documentation.

+0

Итак, вы говорите, что мне придется разделить «__v» инкремент между методами обновления документа ('save') и методами обновления запроса (' findOneAndUpdate', 'update')? Что-то вроде ** [this] (http://pastebin.com/QGxgLhQz) **? – Justin

+0

Да, вам нужно разделить инкремент между документами и посредниками запроса. Я предлагаю иметь 2 разных метода, как показано в моем сообщении, вместо того, чтобы пытаться сжать два разных способа в одном методе. – Antoine

+0

FYI @Antoine, функция запроса MW нуждалась в обратном вызове 'next', который я узнал из [этой темы] (http://stackoverflow.com/questions/35540047/incorrect-document-revision-number-found-in- после обновления-промежуточный слой). Я обновил сообщение – Justin