I MongoDB, $dateFromString
aggregeringspipeline-operatorn konverterar en datum-/tidssträng till ett datumobjekt.
Exempel
Anta att vi har en samling som heter foo
med följande dokument:
{ "_id" : 1, "bar" : "2020-12-31T23:30:25.123" } { "_id" : 2, "bar" : "2020-12-31" } { "_id" : 3, "bar" : "2020-12-31T23:30" }
Alla dokument innehåller en datum-/tidssträng.
Vi kan köra följande kod för att returnera ett datumobjekt från bar
fält i dessa dokument.
db.foo.aggregate([
{
$project: {
date: {
$dateFromString: {
dateString: '$bar'
}
}
}
}
])
Resultat:
{ "_id" : 1, "date" : ISODate("2020-12-31T23:30:25.123Z") } { "_id" : 2, "date" : ISODate("2020-12-31T00:00:00Z") } { "_id" : 3, "date" : ISODate("2020-12-31T23:30:00Z") }
Alla datum-/tidssträngar har konverterats till ett datumobjekt.
Jag har också ändrat fältnamnet från bar
till date
.
Ange ett format
Du kan ange ett valfritt format
argument för att ange formatet för datum-/tidssträngen som tillhandahålls. Formatspecifikationen kan vara vilken sträng som helst och innehålla 0 eller fler formatspecifikationer.
format
parametern är tillgänglig från MongoDB version 4.0.
Standardformatet är %Y-%m-%dT%H:%M:%S.%LZ
, vilket är vad det tidigare exemplet använder.
Anta att vi infogar följande dokument i vår samling:
{ "_id" : 4, "bar" : "07/08/2020" }
I det här fallet kan datumet vara den 7:e dagen i den 8:e månaden eller den 8:e dagen i den 7:e månaden, beroende på vilket språk som används.
Vi kan använda en formatspecifikation för att specificera exakt vilken det ska vara.
Exempel:
db.foo.aggregate([
{ $match: { _id: 4 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
format: "%m/%d/%Y"
}
}
}
}
])
Resultat:
{ "_id" : 4, "date" : ISODate("2020-07-08T00:00:00Z") }
I det här fallet angav vi att det är den 8:e dagen i den 7:e månaden.
Här är den igen, men den här gången byter vi dag och månad.
db.foo.aggregate([
{ $match: { _id: 4 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
format: "%d/%m/%Y"
}
}
}
}
])
Resultat:
{ "_id" : 4, "date" : ISODate("2020-08-07T00:00:00Z") }
Den här gången tolkas det som den 7:e dagen i den 8:e månaden.
Se MongoDB $dateFromString
Formatspecifikationer för en lista över giltiga formatspecifikationer.
ISO-veckodatumformat
Det finns några formatspecifikationer som gör att du kan ange datum med ISO 8601-format.
I synnerhet kan du använda:
Formatspecifikation | Utdata |
---|---|
%G | Årtal i ISO 8601-format |
%u | Veckodagnummer i ISO 8601-format (1-måndag, 7-söndag) |
%V | Årets vecka i ISO 8601-format |
Anta att vi har ett dokument som ser ut så här:
{ "_id" : 5, "bar" : "7-8-2020" }
Vi skulle kunna tolka det datumet som den 7:e dagen i ISO-veckan, följt av den 8:e ISO-veckan på året, följt av året.
Så här:
db.foo.aggregate([
{ $match: { _id: 5 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
format: "%u-%V-%G"
}
}
}
}
])
Resultat:
{ "_id" : 5, "date" : ISODate("2020-02-23T00:00:00Z") }
Ange en tidszon
Du kan ange en tidszon som ska användas med $dateFromString
operatör.
Tidszonen kan specificeras med antingen Olsons tidszonsidentifierare (t.ex. "Europe/London"
, "GMT"
) eller UTC-offset (t.ex. "+02:30"
, "-1030"
).
Olsons tidszonsidentifierare
Här är ett exempel som matar ut datumsträngen i tre olika tidszoner, var och en med Olsons tidszons-ID:
db.foo.aggregate([
{ $match: { _id: 1 } },
{
$project: {
utc: {
$dateFromString: {
dateString: '$bar',
timezone: "UTC"
}
},
honolulu: {
$dateFromString: {
dateString: '$bar',
timezone: "Pacific/Honolulu"
}
},
auckland: {
$dateFromString: {
dateString: '$bar',
timezone: "Pacific/Auckland"
}
}
}
}
]).pretty()
Resultat:
{ "_id" : 1, "utc" : ISODate("2020-12-31T23:30:25.123Z"), "honolulu" : ISODate("2021-01-01T09:30:25.123Z"), "auckland" : ISODate("2020-12-31T10:30:25.123Z") }
UTC-offset
Här är ett exempel som använder UTC-offset.
db.foo.aggregate([
{ $match: { _id: 1 } },
{
$project: {
"date+00:00": {
$dateFromString: {
dateString: '$bar',
timezone: "+00:00"
}
},
"date-10:00": {
$dateFromString: {
dateString: '$bar',
timezone: "-10:00"
}
},
"date+12:00": {
$dateFromString: {
dateString: '$bar',
timezone: "+12:00"
}
}
}
}
]).pretty()
Resultat:
{ "_id" : 1, "date+00:00" : ISODate("2020-12-31T23:30:25.123Z"), "date-10:00" : ISODate("2021-01-01T09:30:25.123Z"), "date+12:00" : ISODate("2020-12-31T11:30:25.123Z") }
Om du använder timezone
kan datumsträngen inte läggas till med ett Z för att indikera Zulu-tid (UTC-tidszon). Till exempel kan datumsträngen inte vara 2020-12-31T23:30:25.123Z
när du använder tidszonsparametern.
Inkludera inte heller tidszonsinformation i datumsträngen när du använder tidszonsparametern.
onNull
Parameter
onNull
parameter kan användas för att ange vad som ska returneras om datumet är null eller inte existerar.
Värdet som tillhandahålls till onNull
parameter kan vara vilket giltigt uttryck som helst.
Anta att vi har ett dokument som detta:
{ "_id" : 6, "bar" : null }
Vi skulle kunna använda onNull
på följande sätt:
db.foo.aggregate([
{ $match: { _id: 6 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
onNull: "No valid date was supplied"
}
}
}
}
])
Resultat:
{ "_id" : 6, "date" : "No valid date was supplied" }
I det här fallet var datumet null
och så inkluderar utdatadokumentet strängen som jag angav för onNull
parameter.
onError
Parameter
Du kan valfritt använda onError
parameter för att tillhandahålla ett uttryck för utmatning i händelse av att ett fel inträffar.
Anta att vår samling innehåller följande dokument:
{ "_id" : 7, "bar" : "21st Dec, 2030" }
Även om det finns ett datum i bar
fältet är det inte en giltig datum-/tidssträng, och det kommer därför att orsaka ett fel om vi använder dateFromString
för att försöka konvertera det till ett datumobjekt.
Exempel på fel:
db.foo.aggregate([
{ $match: { _id: 7 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar'
}
}
}
}
])
Resultat:
Error: command failed: { "ok" : 0, "errmsg" : "an incomplete date/time string has been found, with elements missing: \"21st Dec, 2030\"", "code" : 241, "codeName" : "ConversionFailure" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:618:17 [email protected]/mongo/shell/assert.js:708:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1046:12 @(shell):1:1
Det är ett otäckt utseendefel.
Vi kan använda onError
parameter för att få det att se snyggare ut:
db.foo.aggregate([
{ $match: { _id: 7 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
onError: "An error occurred while parsing the date string"
}
}
}
}
])
Resultat:
{ "_id" : 7, "date" : "An error occurred while parsing the date string" }
Ses som onNull
och onError
parametrar gör att vi kan returnera de faktiska dokumenten, de tillåter oss att returnera flera dokument utan att behöva oroa oss för att ett dåligt dokument stoppar hela operationen.
Exempel:
db.foo.aggregate([
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
onNull: "The date was either empty or null",
onError: "An error occurred while parsing the date string"
}
}
}
}
])
Resultat:
{ "_id" : 1, "date" : ISODate("2020-12-31T23:30:25.123Z") } { "_id" : 2, "date" : ISODate("2020-12-31T00:00:00Z") } { "_id" : 3, "date" : ISODate("2020-12-31T23:30:00Z") } { "_id" : 4, "date" : ISODate("2020-07-08T00:00:00Z") } { "_id" : 5, "date" : ISODate("2020-08-07T00:00:00Z") } { "_id" : 6, "date" : "The date was either empty or null" } { "_id" : 7, "date" : "An error occurred while parsing the date string" }