Поле операции Mongoose - это "найти", когда я делаю "обновление", почему?

Я не знаю, связано ли это с самим Mongoose или драйвером MongoDB.

Вот сделка. Я хочу добавить созданные / обновленные поля в мои схемы. Я знаю, что Mongoose может сделать это из коробки, но мне нужно использовать метку времени Unix вместо объекта даты. Для этого я добавил плагин, который я нашел на Github ( ссылка на плагин), и изменил тип поля на Number для хранения метки времени.

Я нашел эти строки в исходном коде плагина:

schema.pre('update', function(next) {
    if (this.op === 'update') {
        this._update = this._update || {};
        this._update[updatedAt] = new Date().getTime;
        this._update['$setOnInsert'] = this._update['$setOnInsert'] || {};
        this._update['$setOnInsert'][createdAt] = new Date().getTime;
    }
    next();
    });

Если я сделаю

MyAwesomeModel.update(...., function (e, d) {...});

this.op будет равен 'find', а не 'update', поэтому поле 'updated' не будет изменено.

Я не могу понять, почему это так, почему операция "найти", а не "обновить". Я пытался найти исходный код mongoose, но пока не нашел ответа.

1 ответ

Вы можете отказаться от плагина и использовать предложенный здесь код с Date.now () (now () возвращает метку времени Unix):

var ItemSchema = new Schema({
    name        : { type: String, required: true, trim: true },
    created_at  : { type: Number },
    updated_at  : { type: Number }
});

ItemSchema.pre('save', function(next){
  now = Date.now();
  this.updated_at = now;
  if ( !this.created_at ) {
    this.created_at = now;
  }
  next();
});
Другие вопросы по тегам