使用 $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_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'
}
}
}
}
}
}
}])
希望有人能给我一些提示。提前致谢!
此聚合查询将起作用。请注意 "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" }
]
}
}
} } } },
] )
我正在尝试使用 $dateFromString 将一些字符串转换为 MongoDB 的日期格式。但是,由于我感兴趣的字段是数组的一部分,因此我在写下正确的代码时遇到了一些问题。在
[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'
}
}
}
}
}
}
}])
希望有人能给我一些提示。提前致谢!
此聚合查询将起作用。请注意 "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" }
]
}
}
} } } },
] )