使用 $dateFromString(存在 NaT)将 MongoDB 中的数组中的字符串转换为日期格式

Convert string to date format within arrays in MongoDB with $dateFromString (presence of NaT)

我正在尝试使用 $dateFromString 将一些字符串转换为 MongoDB 的日期格式。但是,由于我感兴趣的字段是数组的一部分,因此我在写下正确的代码时遇到了一些问题。在 之后,我尝试将字符串转换为日期格式。不幸的是,日期字段并不总是被填充,有时字符串日期(因为缺少信息)是 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'
             }
           }
         }
       }
     }
   }
}])

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

此聚合查询将起作用。请注意 "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" } 
                                                  ] 
                                           }
                     }
} } } },
] )