将created_at和updated_at字段添加到猫鼬模式

有没有一种方法可以将created_at和updated_at字段添加到猫鼬模式,而不必每次调用新的MyModel()时都将其传递?

created_at字段将是一个日期,并且仅在创建文档时添加。每当在文档上调用save()时,updated_at字段都将被更新为新日期。

我已经在模式中尝试过此操作,但是除非我明确添加,否则该字段不会显示:

var ItemSchema = new Schema({
    name    : { type: String, required: true, trim: true }
  , created_at    : { type: Date, required: true, default: Date.now }
});
2020/03/24 18:06:27

您可以使用的timestamp插件mongoose-troop将此行为添加到任何架构。

Mandy2020/03/24 18:06:27

这就是我实现创建和更新的方式。

在我的架构中,我添加了创建和更新的内容,如下所示:

   / **
     *文章架构
     * /
    var ArticleSchema = new Schema({
        创建:{
            类型:日期,
            默认值:Date.now
        },
        更新: {
            类型:日期,
            默认值:Date.now
        },
        标题:{
            类型:字符串,
            默认值:'',
            修剪:是的,
            必填:“标题不能为空”
        },
        内容:{
            类型:字符串,
            默认值:'',
            修剪:真
        },
        用户:{
            类型:Schema.ObjectId,
            参考:“用户”
        }
    });

然后在我添加的文章控制器内的文章更新方法中:

/ **
     *更新文章
     * /
    exports.update = function(req,res){
        var article = req.article;

        article = _.extend(article,req.body);
        article.set(“ updated”,Date.now());

        article.save(function(err){
            如果(错误){
                返回res.status(400).send({
                    消息:errorHandler.getErrorMessage(err)
                });
            }其他{
                res.json(文章);
            }
        });
    };

粗体部分是您感兴趣的部分。

飞云2020/03/24 18:06:27

在您的模型架构中,只需添加属性时间戳并为其分配值true即可,如下所示:

var ItemSchema = new Schema({
   name :  { type: String, required: true, trim: true },
},{timestamps : true}
);
GO2020/03/24 18:06:26

timestamps对您的模式使用内置选项。

var ItemSchema = new Schema({
    name: { type: String, required: true, trim: true }
},
{
    timestamps: true
});

这将自动将createdAtupdatedAt字段添加到您的架构。

http://mongoosejs.com/docs/guide.html#timestamps

猪猪2020/03/24 18:06:26

如果使用update()findOneAndUpdate()

{upsert: true}选择

您可以使用 $setOnInsert

var update = {
  updatedAt: new Date(),
  $setOnInsert: {
    createdAt: new Date()
  }
};