在我的数据库集合中,我希望每次使用当前日期时间更新记录时更新“lastChanged”字段。我希望它与mongoose的默认日期格式相同,如:
ISODate("2011-10-06T14: 01: 31.106Z")
任何智慧的话语?
答案 0 :(得分:17)
如果您只想使用ISO字符串:
new Date().toISOString()
答案 1 :(得分:11)
实现此目的的一种方法是使用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
。为了使用pre
或post
中间件,您应该find()
该文档,并致电init
,validate
,{文档上的{1}}或save
个函数。请参阅explanation。
更新:请参阅此问题“add created_at and updated_at fields to mongoose schemas”
答案 2 :(得分:7)
几天后,Mongo将发布新的2.6版本(目前你可以下载实验性的2.5.x版本)。在many other features中,您可以使用$currentDate来完成您想要的任务:
db.users.update(
<criteria>,
{
$currentDate: { yourField: true},
}
)
答案 3 :(得分:0)
中间件功能是一种很好的方法,但是应该使用
SomethingSchema.pre('save', function preSave(next){
var something = this;
something.updatedAt = Date.now();
next();
});
因为something.updateAt不是函数。
答案 4 :(得分:0)
我添加了 updated: new Date 来解决类似的问题。这是我如何使用它。
update: (req, res) => {
let userId = req.params.id;
let userParams = {
name: {
first: req.body.first,
last: req.body.last
},
email: req.body.email,
password: req.body.password,
updated: new Date
};
db.User.findOneAndUpdate(userId, { $set: userParams })
.then(upUser => res.json(`Profile Updated for: ${upUser.fullName}`))
.catch(err => res.status(422).json(err));
}