mongoose 进阶之 timestamps

2,027 阅读2分钟

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")",
}

默认情况下,生成字段的名称为 createdAtupdatedAt,可以通过设置 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
}

默认时间精确到毫秒级!

修改时间戳格式

默认情况下,Mongoosenew 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) 格式,查询方法也更加便捷,查询性能也会更优!