【发布时间】: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_datainizio、dtcessazioneeffettiva和dtfineprevista。但是,在某些情况下,他们可以假设 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