MongoDB创建时间和更新时间的自动更新,以及存储格式问题

87 阅读2分钟

最近在写node服务时、遇到创建时间,更新时间每次变更都需要手动去触发更新,在网上搜了一些资料后,看到官网提供了2种方式来解决这个问题

解法

以下为官网文档示例 , 我们只需要在new Schema时加一个参数即可


const schema = Schema({
  createdAt: Number,
  updatedAt: Number,
  name: String
}, {
   // Make Mongoose use Unix time (seconds since Jan 1, 1970)
  timestamps: { currentTime: () => Date.now() }
});

如下为结果、我们可以看到已经自动添加创建时间和更新时间值 image转存失败,建议直接上传图片文件

这里我们会遇到一个问题,如果你创建时间字段和更新时间字段换了别的名字、你会发现创建出来的时间字段key并不是你期望的,它会自动填充成createdAt和updatedAt

这个时候我们配置改成如下

const schema = Schema({
  createdAt: Number,
  updatedAt: Number,
  name: String
}, {
  timestamps: {
        updatedAt: 'abc',
        createdAt: 'def',
    }
});

我们重新创建一条数据,来看下结果 image-1664336330153转存失败,建议直接上传图片文件 我们可以看到名字已经修改了。 这里我们可能有一个疑问,为什么它存成字符串了,我想存成时间戳怎么办?处理起来也比较简单、我们只需给字段指定一个类型即可

const schema = Schema({
  abc: Number,
  name: String
}, {
  timestamps: {
        updatedAt: 'abc',
        createdAt: 'def',
    }
});

我们看下结果,已经变成时间戳 image-1664336578352转存失败,建议直接上传图片文件

如果想改为其它类型存储格式,我们只需修改currentTime的返回值即可,如下


const schema = Schema({
  abc: String,
}, {
  timestamps: {
         updatedAt: 'abc',
         currentTime: () => '666',
    }
});

结果如下 image-1664368685342转存失败,建议直接上传图片文件

其它方案-开发Schema插件

Schema是可插拔的,也就是说,它们提供在应用预先打包能力来扩展他们的功能。 如下示例

module.exports = exports = function lastModified(schema,options){
  schema.add({lastModify:Date});
  schema.pre('save',function(next){
    this.lastModify = new Date;
    next();
  });
  if(options&& options.index){
    schema.path('lastModify').index(options.index);
  }
}
let plugin = require('./plugin');
let Person = new Schema({age:number});
Person.plugin(plugin,{index:true});

参考链接

mongoosejs 将 createdAt 和 updateAt 存储为 Unix 时间戳 mongoose schema 设置更新时间戳为unix时间