createdAt 和 updatedAt
在数据表结构中,创建时间 和 更新时间 是必不可少的字段。因为业务逻辑涉及数据的时间过滤查询,数据追溯等需求。因此开发者需要手动记录创建时间和更新时间。
Mongoose
在创建时Schema
提供了timestamps
参数,该参数会让Mongoose
自动开启创建时间和更新时间。
Schema 定义举例:
const Role = new Schema({
...
}, {
timestamps: true,
});
生成数据如下:
{
"createdAt": "ISODate("2021-01-13T10:05:46.987Z")",
"updatedAt": "ISODate("2021-01-13T10:05:46.987Z")",
}
默认情况下,生成字段的名称为
createdAt
和updatedAt
,可以通过设置timestamps
定制字段名称。
自定义时间字段名称
Schema 定义举例:
const Role = new Schema({
...
}, {
timestamps: { createdAt: 'created', updatedAt: 'updated' },
});
生成数据如下:
{
"created": "ISODate("2021-01-13T10:05:46.987Z")",
"updated": "ISODate("2021-01-13T10:05:46.987Z")",
}
默认情况下 mongoose 生成的时间格式为 UTC 时间,这种格式查询数据极不方便, 比如日期范围查询,可以将时间格式固定为 string 或时间戳 number 类型
修改时间格式
Schema 定义举例:
const Role = new Schema({
...
created: {
type: number
},
updated: {
type: number
}, {
timestamps: { createdAt: 'created', updatedAt: 'updated' },
});
生成数据如下:
{
"created" : 1610534416616,
"updated" : 1610534416616
}
默认时间精确到毫秒级!
修改时间戳格式
默认情况下,
Mongoose
用new Date()
获取当前时间。可以设置该timestamps.currentTime
选项来覆盖Mongoose
获取当前时间的格式。
Schema 定义举例:
const Role = new Schema({
...
created: {
type: number
},
updated: {
type: number
},
{
timestamps: { currentTime: () => Math.floor(Date.now() / 1000), createdAt: 'created', updatedAt: 'updated' },
}
});
生成数据如下:
{
"created": 1610536511,
"updated": 1610536511
}
时间精确到秒级!
总结
大部分业务都会有记录数据的创建时间和修改时间的需求。服务端将时间统一处理成 number
(1610534696) 格式或者 string
(2021-01-13) 格式,查询方法也更加便捷,查询性能也会更优!