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 属性并更新所有当前文档