0

Я не знаю, связано ли это с самим Mongoose или с драйвером MongoDB.Поле операции Mongoose - это «найти», когда я «обновляю», почему?

Здесь находится сделка. Я хочу добавить созданные/обновленные поля в мои схемы. Я знаю, что Mongoose может сделать это из коробки, но мне нужно использовать временную метку Unix вместо объекта даты. Для этого я добавил плагин, который я нашел в Github (link to plugin), и изменил тип поля на 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 будет равен 'найти', а не 'обновление', так «обновленное» поле не изменяется.

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

+0

Update делает регулярный вызов драйвера Монго. Schema.update обходит промежуточное ПО по дизайну. Следовательно '.pre' не работает с' update'. Вы можете получить более подробную информацию: https://github.com/Automattic/mongoose/issues/2672 –

ответ

0

Вы можете угробить плагин и использовать предложенную code here с Date.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(); 
}); 
Смежные вопросы