如何在每次保存时使用Mongoose模式更新当前日期的属性?

wil*_*age 14 mongoose mongodb nosql node.js

在我的数据库集合中,我希望每次使用当前日期时间更新记录时更新"lastChanged"字段.我希望它的格式与mongoose的默认日期相同:

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

任何智慧的话?

gre*_*ala 17

如果您只想使用ISO String:

new Date().toISOString()
Run Code Online (Sandbox Code Playgroud)

  • 这是您创建一个有效的ISO字符串以插入Mongo的方法. (3认同)
  • 抱歉,我认为这不能回答问题。问题不是,“如何创建ISO字符串”。 (2认同)

Dav*_*sen 12

实现此目的的一种方法是使用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();
});
Run Code Online (Sandbox Code Playgroud)

但是,似乎并不总是调用中间件:

关于findAndUpdate()的注释

pre并且post不要求直接对数据库进行更新执行操作,包括Model.update,.findByIdAndUpdate,.findOneAndUpdate,.findOneAndRemove,和.findByIdAndRemove.order利用prepost中间件,你应该find()文档,并调用init,validate,save,或remove在文档的功能.见解释.

更新:请参阅此问题" 将created_at和updated_at字段添加到mongoose架构 "

  • 您现在可以在> MongooseJS 4.0中为`update`调用中间件 (2认同)

Sal*_*ali 7

在几天内,Mongo将宣布新的2.6版本(目前你可以下载实验性的2.5.x版本).在许多其他功能中,你可以使用$ currentDate来完成你想要的东西:

db.users.update( 
  <criteria>,
  {
     $currentDate: { yourField: true},
  }
)
Run Code Online (Sandbox Code Playgroud)