首页 > 解决方案 > 将数据类型从字符串更改为日期,同时跳过丢失的数据

问题描述

我的数据库中的核心集合(数据库中的其他集合参考这个集合)包含 3 个带有日期信息的字段,此时这些字段被格式化为字符串,如MM/DD/YYYY。此外,还有一系列文档,该字段包含缺失数据,即""mongoimport我通过在 JSON 文件上运行命令来填充此集合。

我的目标是将这些日期字段转换为实际的ISODate数据类型,以便允许按日期过滤集合。此外,我希望 MongoDB 知道空字符串表示缺失值。我对此进行了广泛阅读,导致我尝试了很多事情:

  1. 尝试forEach声明 - 这有效,但仅适用于第一个文档。
db.collection.find().forEach(function(element){
   element.startDate = ISODate(element.startDate);
   db.collection.save(element);
})
  1. 使用一种 for 循环:效果很好,但是一旦遇到缺失值就停止了(因此它转换了大约 11 个值):
db.collection.update(
     {
        "startDate":{
           "$type":"string"
        }
     },
     [
        {
           "$set":{
              "startDate":{
                 "$dateFromString":{
                    "dateString":"$startDate",
                    "format":"%m/%d/%Y"
                 }
              }
           }
        }
     ]
  )

所以,这两种方法都起作用了——但我不知道如何将它们应用到整个集合中。此外,我有兴趣以最有效的方式执行此任务。但是,我只想这样做一次 - 将来添加的数据应该希望在导入阶段正确格式化。

标签: mongodbdate

解决方案


db.collection.updateMany(
    {
        "$and": [
            { "startDate": { "$type": "string" } },
            { "startDate": { "$ne": "" } }
        ]
    },
    [
       {
        "$set": {
            "startDate": {
                "$dateFromString": {
                    "dateString": "$startDate",
                    "format": "%m/%d/%Y"
                }
            }
        }
    }
]
)

过滤掉空字符串而不是进行转换将忽略日期字段中具有空字符串的文档。


推荐阅读