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

时间:2019-01-30 19:53:55

标签: node.js mongodb mongoose

我正在尝试通过向所有之前缺少时间戳的行添加时间戳来迁移数据库。我已经使用_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({
        "type": {
            type: String,
            trim: true,
            enum: Object.values(questionTypes),
            required: 'Question type is required'
        },
        "text": {
            type: String,
            required: true
        },
        "desc": NotRequiredStringSchema,
        "options": [{
            "id": ObjectId,
            "name": NotRequiredStringSchema,
            "helperText": NotRequiredStringSchema,
            "icon_key": NotRequiredStringSchema,
            "icon_url": NotRequiredStringSchema,
            "icon_svg": NotRequiredStringSchema
        }],
        "placeHolder": NotRequiredStringSchema,
        "buttonPosition": NotRequiredStringSchema,
        "buttonText": NotRequiredStringSchema,
        "buttonHoverText": NotRequiredStringSchema,
        "helperText": NotRequiredStringSchema,
        "max": Number,
        "min": Number,
        "default": Mixed,
        "icon_key": NotRequiredStringSchema,
        "icon_url": NotRequiredStringSchema,
        "icon_svg": NotRequiredStringSchema,
        "showTick": { type: Boolean, required: false, default: false },
        "lang": {
            required: true,
            type: Map,
            of: {
                type: Map,
                of: String
            }
        }
    }, {
            timestamps: true
        });

2 个答案:

答案 0 :(得分:0)

问题在于,您的架构不包含 createdAt 字段,默认情况下,mongo会在启用了strict选项的情况下保存数据,如果您的架构不包含字段,则无法向其添加新字段{ {3}}。因此,您首先需要将 createdAt 字段添加到架构中,以下仅是示例。

 createdAt: {type: Date, default: Date.now}

将其添加为字段后,您的查询应该可以正常工作。

答案 1 :(得分:0)

如果您这样创建架构

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

然后,您可以使用middleware来更新创建和更新记录时的created.At和updatedAt值。

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

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