mongoose schema 设置更新时间戳为unix时间

Posted feiniao8651

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongoose schema 设置更新时间戳为unix时间相关的知识,希望对你有一定的参考价值。

背景

mongoose在schema中可以开启时间戳,当数据更新时,自动记录更新时间。

var schema = new Schema(
    music_id:String
,
    timestamps: true
    );

但是这里开启后,在数据库中存储的createdAt和updatedAt数据格式是ISODate数据,这里想改成用unix时间的格式。
官方文档中显示是支持设置成unix时间格式的,从github上开发者的回复来看,从mongoose 5.9.0开始就支持这一功能。

2016-05-09:
Might be easier to implement this as a plugin. Getting it into core mongoose while still being backwards-compatible with the current timestamps implementation will be a pain, but plugins make this super easy 😃
FWIW, mongodb internally stores dates as a unix timestamp, just the mongodb driver converts them into javascript dates.

2020-02-16:
yep it is released in 5.9.0, see timestamps docs for an example.

问题复现

按照官方文档中的方式,我们实现timestamps.currentTime的自定义函数

var schema = new Schema(
    music_id:String
,
    timestamps: currentTime: () => Math.floor(Date.now() / 1000 )
    );

运行代码后,发现updatedAt仍然是Date格式。难道是timestamps的类型不对,增加type定义试试(这里也有网上其他资料对我的误导)

var schema = new Schema(
    music_id:String
,
    timestamps: 
        type: Number,
        currentTime: () => Math.floor(Date.now() / 1000 )
        
    );

运行代码后,仍然是Date格式。

解决方式

再来看官方的文档,示例代码是这么写的

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

不要只看到注释下面的实现,上面对于createdAt和updatedAt的类型声明也同样重要。所以我们刚才一直存储为Date类型的原因,就是因为createdAt和updatedAt的默认类型是Date。在timestamps中声明type是无效的。

var schema = new Schema(
    music_id:String,
    createdAt: Number,
    updatedAt: Number
,
    timestamps: 
        currentTime: () => Math.floor(Date.now() / 1000 )
        
    );

运行代码后,现在updatedAt的格式变成unix时间了。

后记

网上也有通过插件形式实现updatedAt格式用unix时间存储的,实现原理很简单,就是设置了一个触发器,监听数据的update行为。具体可以查看mongoose-timestamp

参考:
Mongoose Doc
Store createdAt and updateAt as Unix timestamps?

放一个让我产生误解的网上资料截图: 注意!!!这是有问题的资料,看完我上面写的应该知道是哪里出问题了

以上是关于mongoose schema 设置更新时间戳为unix时间的主要内容,如果未能解决你的问题,请参考以下文章

mongoose schema 设置更新时间戳为unix时间

mongoose schema 设置更新时间戳为unix时间

Mongoose -> 从自定义 Schema 方法更新文档

Mongoose:添加新的 Schema 属性并更新所有当前文档

Mongoose:添加新的 Schema 属性并更新所有当前文档

如何在 Mongoose 中更新/插入文档?