如何在Mongoose中强制将createdAt保存为数字时间戳?
把Mongoose的createdAt/updatedAt改成数字时间戳的方法
Mongoose默认用ISO日期格式(比如2022-10-21T14:31:09.650+00:00)存储createdAt和updatedAt,要改成数字时间戳(比如201546541658323这种毫秒级戳),有两种实用方案:
方案一:用内置timestamps直接指定类型(推荐)
Mongoose 5.x及以上版本支持给timestamps选项指定类型,直接设为Number就能自动存储数字时间戳,不用额外写中间件,最省心:
const mediaSchema = new mongoose.Schema({ name: { required: true, type: String, // 注意:原始代码里的小写string要改成大写String,否则会报错 }, }, { timestamps: { type: Number, // 强制时间戳存为数字类型 // 可选:如果要自定义字段名可以改这里,默认就是createdAt和updatedAt // createdAt: 'createTime', // updatedAt: 'updateTime' } });
方案二:手动定义字段+中间件控制
如果需要更灵活的控制(比如给创建时间加不可修改限制),可以自己定义createdAt和updatedAt字段,再用中间件赋值:
const mediaSchema = new mongoose.Schema({ name: { required: true, type: String, // 纠正原始代码的小写string错误 }, createdAt: { type: Number, default: Date.now, // 首次保存时自动设为当前毫秒时间戳 immutable: true // 可选:设置后创建时间就不能被修改了 }, updatedAt: { type: Number, default: Date.now } }); // 保存时更新updatedAt mediaSchema.pre('save', function(next) { if (this.isModified()) { // 只有文档被修改时才更新 this.updatedAt = Date.now(); } next(); }); // 支持findOneAndUpdate这类更新操作 mediaSchema.pre(['updateOne', 'findOneAndUpdate'], function(next) { this.set({ updatedAt: Date.now() }); next(); });
两种方案生成的都是毫秒级数字时间戳,和你示例里的格式一致。
内容的提问来源于stack exchange,提问作者morteza mortezaie
相关产品推荐
相关产品推荐

