向已创建的文档添加日期类型

Posted

技术标签:

【中文标题】向已创建的文档添加日期类型【英文标题】: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中提取创建日期:***.com/questions/7327296/… @makmonty 我可以接受旧文档有任何旧日期,而不必寻找确切的创建日期,因为数组会被更新多次。 我认为用一个命令是不可能的,你必须编写一些脚本来实现这一点。 【参考方案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

以上是关于向已创建的文档添加日期类型的主要内容,如果未能解决你的问题,请参考以下文章

graphql prisma node js postgresql如何将创建日期/更新字段添加到graphql类型?

SQL Server 修改日期

clickhouse

mysql 中,创建表时如何定义一个日期类型的字段

Google BigQuery日期数据类型?

引导输入类型=“日期”不加载日期选择器