首页 > 解决方案 > 如何使用 mongoose 在 mongoDB 中手动设置 createdAt 时间戳?

问题描述

我正在尝试通过将时间戳添加到之前缺少时间戳的所有行来迁移我的数据库。我已经使用 _id 计算了 createdAt 时间戳,但我无法设置时间戳。我在这里做错了什么?有人可以帮忙吗?

    let Question = db.model('Question');

    let items = await Question.findWithDeleted();

    let processedIds = items.map((q) => q._id);
    processedIds.forEach(function (id) {

        const timestamp = id.getTimestamp();

        // const date = new Date(parseInt(timestamp, 16) * 1000);
        // echo(timestamp)
        Question.update({ "_id": id }, { "$set": { createdAt: timestamp } }, (h) => {
            console.log(h);
        });

    });

这是模型:

    const Question = new Schema({
        “类型”: {
            类型:字符串,
            修剪:真的,
            枚举:Object.values(问题类型),
            required: '问题类型是必需的'
        },
        “文本”: {
            类型:字符串,
            要求:真
        },
        "desc": NotRequiredStringSchema,
        “选项”: [{
            “id”:对象 ID,
            “名称”:NotRequiredStringSchema,
            “helperText”:NotRequiredStringSchema,
            “icon_key”:NotRequiredStringSchema,
            “icon_url”:NotRequiredStringSchema,
            “icon_svg”:NotRequiredStringSchema
        }],
        “placeHolder”:NotRequiredStringSchema,
        “buttonPosition”:NotRequiredStringSchema,
        “buttonText”:NotRequiredStringSchema,
        "buttonHoverText": NotRequiredStringSchema,
        “helperText”:NotRequiredStringSchema,
        “最大”:数字,
        “分钟”:数字,
        “默认”:混合,
        “icon_key”:NotRequiredStringSchema,
        “icon_url”:NotRequiredStringSchema,
        “icon_svg”:NotRequiredStringSchema,
        "showTick": { type: Boolean, required: false, default: false },
        “朗”:{
            要求:真,
            类型:地图,
            的: {
                类型:地图,
                的:字符串
            }
        }
    }, {
            时间戳:真
        });

标签: node.jsmongodbmongoose

解决方案


如果你让你的架构像这样

const SchemaName = new Schema({
 .......
}, {
  timestamps: true
})

它将自动创建 createdAt 和 updatedAt 字段,并在每次执行创建和更新操作时更新它们的值。

现在其他情况,如果您手动创建 createdAt 和 updatedAt 字段,例如此架构

const SchemaName = new Schema({
 .......
 createdAt: { type: Date, default: Date.now },
 updatedAt: { type: Date, default: Date.now }
})

然后,您可以在创建和更新记录时使用中间件更新 createdAt 和 updatedAt 值。

SchemaName.post('save', (doc) => {
  console.log('%s has been saved', doc._id);
});

SchemaName.pre('update', () => {
  this.update({},{ $set: { updatedAt: new Date() } });
});

推荐阅读