【问题标题】:Adding date type to the documents already created向已创建的文档添加日期类型
【发布时间】:2020-12-13 03:18:42
【问题描述】:

我的猫鼬模式定义如下。

mongoose.Schema({
    "url": String,
    "translations": [
        {
            "targetLang": String,
            "source": String,
            "target": String
        }
    ],
}, { versionKey: false });

我更新了架构以包含 createdAtupdatedAt,新架构如下所示:

mongoose.Schema({
    "url": String,
    "translations": [
        {
            "targetLang": String,
            "source": String,
            "target": String,
            "createdAt": { type: Date, default: Date.now },
            "updatedAt": { type: Date, default: Date.now }
        }
    ],
}, { versionKey: false });

因此,当创建新文档时,createdAtupdatedAt 会按预期自动填充。如何使用新密钥 createdAtupdatedAt 获取旧文档。有什么办法吗?

注意:我可以将旧文档保留为当前日期或之前的任何日期。但我希望他们都有个约会。

【问题讨论】:

  • 可以查看这个问题的答案,从文档的ObjectId中提取创建日期:stackoverflow.com/questions/7327296/…
  • @makmonty 我可以接受旧文档有任何旧日期,而不必寻找确切的创建日期,因为数组会被更新多次。
  • 我认为用一个命令是不可能的,你必须编写一些脚本来实现这一点。

标签: javascript node.js mongodb mongoose database-schema


【解决方案1】:

您需要手动更新它们,例如从 mongoshell:

{
    const toUpdate = db.getCollection('collection').find({
        $or: [
            { 'translations.createdAt': null },
            { 'translations.updatedAt': null }
        ]
    });

    toUpdate.forEach(doc => {
        const timestamp = doc._id.getTimestamp();
        doc.translations.createdAt = timestamp;
        doc.translations.updatedAt = timestamp;
        
        db.getCollection('collection').updateOne({ _id: doc._id }, { $set: doc });
    });
}

【讨论】:

  • @Amanda 的问题是文档嵌套在子数组中,而不是在顶层。此代码会将 createdAt 和 updatedAt 添加到每个文档的顶层。
  • 你能推荐一种使用猫鼬的方法吗?
  • 这是一次性修复,为什么要将它包含在您的代码库中?无论如何,我认为它也应该适用于猫鼬,如果你去掉外花括号
  • translations 内部发生更新时,有没有办法自动更新updatedAt 字段?目前,我必须在更新时明确传递date
猜你喜欢
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
  • 2012-04-14
  • 2013-03-02
  • 1970-01-01
  • 2018-06-20
  • 2020-04-11
相关资源
最近更新 更多