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

时间:2011-10-06 14:12:29

标签: node.js mongodb mongoose nosql

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

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

任何智慧的话语?

5 个答案:

答案 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()的说明

     直接在数据库上执行的更新操作不会调用

prepost,包括Model.update.findByIdAndUpdate.findOneAndUpdate.findOneAndRemove.findByIdAndRemove。为了使用prepost中间件,您应该find()该文档,并致电initvalidate,{文档上的{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));
    }