如何使用 mongoose 在 mongoDB 中手动设置 createdAt 时间戳?

Abh*_*ain 2 mongoose mongodb node.js

我正在尝试通过向所有先前缺少时间戳的行添加时间戳来迁移我的数据库。我已经使用 _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);
        });

    });
Run Code Online (Sandbox Code Playgroud)

这是模型:

    const 问题 = 新架构({
        “类型”: {
            类型:字符串,
            修剪:真实,
            枚举:Object.values(questionTypes),
            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 },
        “朗”:{
            要求:真实,
            类型:地图,
            的: {
                类型:地图,
                的:字符串
            }
        }
    }, {
            时间戳:真
        });

Ash*_*hok 5

如果你让你的架构是这样的

const SchemaName = new Schema({
 .......
}, {
  timestamps: true
})
Run Code Online (Sandbox Code Playgroud)

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

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

const SchemaName = new Schema({
 .......
 createdAt: { type: Date, default: Date.now },
 updatedAt: { type: Date, default: Date.now }
})
Run Code Online (Sandbox Code Playgroud)

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

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

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