You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 07:00:59