Подтвердить что ты не робот

Как обновить свойство с текущей датой в схеме Mongoose при каждом сохранении?

В моих коллекциях баз данных я хочу обновлять поле lastChanged каждый раз, когда запись обновляется текущим временем. Я хочу, чтобы он был в том же формате, что и для даты по умолчанию mongoose, например:

ISODate("2011-10-06T14: 01: 31.106Z")

Любые слова мудрости?

4b9b3361

Ответ 1

Если вы просто хотите использовать строку ISO:

new Date().toISOString()

Ответ 2

Через несколько дней Mongo собирается анонсировать новую версию 2.6 (в настоящее время вы можете скачать экспериментальную версию 2.5.x). Среди многих других функций вы можете использовать $currentDate, который идет делать именно то, что вы хотите:

db.users.update( 
  <criteria>,
  {
     $currentDate: { yourField: true},
  }
)

Ответ 3

Одним из способов достижения этой цели является использование Mongoose Middleware и обновление предварительного сохранения поля.

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
//schema
var SomethingSchema = new Schema({
  text: {type: String},
  createdAt: {type: Date, default: Date.now},
  updatedAt: {type: Date, default: Date.now}
});

//middle ware in serial
SomethingSchema.pre('save', function preSave(next){
  var something = this;
  something.updatedAt(Date.now());
  next();
});

Кажется, однако, что промежуточное ПО не всегда вызывается:

Заметки о findAndUpdate()

pre и post не вызываются для операций обновления, выполняемых непосредственно в базе данных, включая Model.update, .findByIdAndUpdate, .findOneAndUpdate, .findOneAndRemove и .findByIdAndRemove.order для использования pre или post, вы должны find() документа и вызовите функции init, validate, save или remove в документе. См. объяснение.

Обновление: См. этот вопрос "добавить поля created_at и updated_at в mongoose schemas"