【问题标题】:Convert string to date format within arrays in MongoDB with $dateFromString (presence of NaT)使用 $dateFromString 将 MongoDB 中数组中的字符串转换为日期格式(存在 NaT)
【发布时间】:2020-03-14 21:03:46
【问题描述】:

我正在尝试使用 $dateFromString 将一些字符串转换为 MongoDB 的日期格式。但是,由于我感兴趣的字段是数组的一部分,因此在编写正确代码时遇到了一些问题。在this discussion 之后,我尝试将字符串转换为日期格式。不幸的是,日期字段并不总是填写,有时字符串日期(因为缺少信息)是 NaT。因此,我返回的代码如下错误:

[js] uncaught exception: Error: command failed: {
            "ok" : 0,
            "errmsg" : "Error parsing date string 'Na'; 0: passing a time zone identifier as part of the string is not allowed 'N'",
            "code" : 241,
            "codeName" : "ConversionFailure"
    } : aggregate failed :

这里有一个我的文档示例:

[
    {
        "cflavoratore_crip": "00753DCF12E23D69F5E4CF95A04700AC",
        "annonascita": 1978,
        "codgenere": "M",
        "attivazioni": [
            {
                "cfdatore_crip": "6C1DFCC6596D219ADAAE5ABA9C853015",
                "rapporto_datainizio": "2009-12-30 00:00:00",
                "codregionelavoro": "Puglia",
                "codprovincialavoro": 73.0,
                "dtcessazioneeffettiva": "2010-01-01 00:00:00",
                "dtfineprevista": "2010-01-01 00:00:00"
            }
        ]
    },
    {
        "cflavoratore_crip": "0083422D66F4C2EAEBB1B296DF86975A",
        "annonascita": 1985,
        "codgenere": "M",
        "attivazioni": [
            {
                "cfdatore_crip": "27E232D343049C13213C4DCA5756B5A5",
                "rapporto_datainizio": "2015-07-29 00:00:00",
                "codregionedomicilio": "Sicilia",
                "codprovincialavoro": 87.0,
                "dtcessazioneeffettiva": "2015-08-13 00:00:00",
                "dtfineprevista": "NaT"
            }
        ]
    }
]

我想转换为日期格式的变量如下:rapporto_datainiziodtcessazioneeffettivadtfineprevista。但是,在某些情况下,他们可以假设 NaT 的值。我想我应该使用 $cond 来解决这个问题(?)。

到目前为止,我使用的代码如下(集合名称:datacico)。好长……

db.datacico.aggregate([
    {
        '$addFields': {
            'attivazioni': {
                '$map': {
                    'input': '$attivazioni', 
                    'as': 'attivazioni', 
                    'in': {  
                        'cfdatore_crip': '$$attivazioni.cfdatore_crip',
                        'rapporto_datainizio': {
                            '$toDate': {
                                '$substr': [
                                    '$$attivazioni.rapporto_datainizio', 0, {
                                        '$subtract': [ 
                                            {
                                                '$strLenCP': '$$attivazioni.rapporto_datainizio'
                                            }, 1
                                        ]
                                    }
                                ]
                            }     
                        }, 
                        'codregionedomicilio': '$$attivazioni.codregionedomicilio', 
                        'codregionelavoro': '$$attivazioni.codregionelavoro',
                        'codprovincialavoro': '$$attivazioni.codprovincialavoro',                 
                        'dtcessazioneeffettiva': {
                            '$toDate': {
                                '$substr': [
                                    '$$attivazioni.dtcessazioneeffettiva', 0, {
                                        '$subtract': [
                                            {
                                                '$strLenCP': '$$attivazioni.dtcessazioneeffettiva'
                                            }, 1
                                        ]
                                    }
                                ]
                            }     
                        },                    
                        'dtfineprevista': {
                            '$toDate': {
                                '$substr': [
                                    '$$attivazioni.dtfineprevista', 0, {
                                        '$subtract': [
                                            {
                                                '$strLenCP': '$$attivazioni.dtfineprevista'
                                            }, 1
                                        ]
                                    }
                                ]
                            }     
                        }
                    }
                }
            }
        }
    }, {
        '$out': 'datacico'
    }
])

尽管如此,我认为使用 $dateFromString 可以变得更容易和更短。我使用了以下一个,但它不起作用。在这种情况下,我只提到了 rapporto_datainizio 的字段。

db.datacico.aggregate([{
"$project": {
    "attivazioni": {
      "$map": {
        "input": "$attivazioni",
       "in": {
         "rapporto_datainizio": {
            "$dateFromString": {
              "dateString": '$rapporto_datainizio'
             }
           }
         }
       }
     }
   }
}])

我希望有人能给我一些提示。提前谢谢!

【问题讨论】:

    标签: arrays mongodb string-to-datetime


    【解决方案1】:

    此聚合查询将起作用。请注意,“NaT”的值不能转换为 Date 对象。那么,你的逻辑是什么?在查询中,我将“NaT”替换为今天的日期(参见$map 中的$cond);但您可以填写您的应用程序需要的内容。

    db.dates.aggregate( [
    { $project: { 
           attivazioni: { 
               $map: {
                   input: "$attivazioni",
                      as: "att",
                      in: {
                          "cfdatore_crip" : "$$att.cfdatore_crip",
                          "rapporto_datainizio" : { $toDate: "$$att.rapporto_datainizio" },
                          "codregionelavoro" : "$$att.codregionelavoro",
                          "codprovincialavoro" : "$$att.codprovincialavoro",
                          "dtcessazioneeffettiva" : { $toDate: "$$att.dtcessazioneeffettiva" },
                          "dtfineprevista" : { $cond: [ { $eq: [ "$$att.dtfineprevista", "NaT" ] }, 
                                                         ISODate(), 
                                                         { $toDate: "$$att.dtfineprevista" } 
                                                      ] 
                                               }
                         }
    } } } },
    ] )
    

    【讨论】:

    • 感谢@prasad_ 的帮助!
    猜你喜欢
    • 2020-07-24
    • 2016-06-12
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    相关资源
    最近更新 更多