I MongoDB er $dateFromString
aggregeringspipeline-operator konverterer en dato/tidsstreng til et datoobjekt.
Eksempel
Antag, at vi har en samling kaldet foo
med følgende dokumenter:
{ "_id" : 1, "bar" : "2020-12-31T23:30:25.123" } { "_id" : 2, "bar" : "2020-12-31" } { "_id" : 3, "bar" : "2020-12-31T23:30" }
Alle dokumenter indeholder en dato-/tidsstreng.
Vi kan køre følgende kode for at returnere et datoobjekt fra bar
felter i disse dokumenter.
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") }
Alle dato/tidsstrenge er blevet konverteret til et datoobjekt.
Jeg har også ændret feltnavnet fra bar
til date
.
Angiv et format
Du kan angive et valgfrit format
argument for at specificere formatet på den dato/klokkeslæt streng, der leveres. Formatspecifikationen kan være en hvilken som helst streng literal, indeholdende 0 eller flere formatspecifikationer.
format
parameter er tilgængelig fra MongoDB version 4.0.
Standardformatet er %Y-%m-%dT%H:%M:%S.%LZ
, hvilket er hvad det foregående eksempel bruger.
Antag, at vi indsætter følgende dokument i vores samling:
{ "_id" : 4, "bar" : "07/08/2020" }
I dette tilfælde kan datoen være den 7. dag i den 8. måned eller den 8. dag i den 7. måned, afhængigt af den anvendte lokalitet.
Vi kan bruge en formatspecifikation til at specificere præcis hvilken det skal være.
Eksempel:
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 dette tilfælde har vi specificeret, at det er den 8. dag i den 7. måned.
Her er den igen, men denne gang bytter vi dag og måned rundt.
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") }
Denne gang tolkes det som den 7. dag i den 8. måned.
Se MongoDB $dateFromString
Formatspecifikationer for en liste over gyldige formatspecifikationer.
ISO-ugedatoformat
Der er et par formatspecifikationer, der gør det muligt for dig at angive datoer ved hjælp af ISO 8601-format.
Du kan især bruge:
Formatspecifikation | Output |
---|---|
%G | Årtal i ISO 8601-format |
%u | Ugedagnummer i ISO 8601-format (1-mandag, 7-søndag) |
%V | Årets uge i ISO 8601-format |
Antag, at vi har et dokument, der ser sådan ud:
{ "_id" : 5, "bar" : "7-8-2020" }
Vi kunne fortolke denne dato som værende den 7. dag i ISO-ugen, efterfulgt af den 8. ISO-uge i året, efterfulgt af året.
Sådan:
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") }
Angiv en tidszone
Du kan angive en tidszone, der skal bruges med $dateFromString
operatør.
Tidszonen kan specificeres ved at bruge enten Olsons tidszone-id (f.eks. "Europe/London"
, "GMT"
) eller UTC offset (f.eks. "+02:30"
, "-1030"
).
Olson Timezone Identifier
Her er et eksempel, der udsender datostrengen i tre forskellige tidszoner, hver ved hjælp af Olsons tidszone-id'er:
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
Her er et eksempel, der bruger 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") }
Hvis du bruger timezone
parameter, kan datostrengen ikke tilføjes et Z for at angive Zulu-tid (UTC-tidszone). For eksempel kan datostrengen ikke være 2020-12-31T23:30:25.123Z
når du bruger tidszoneparameteren.
Medtag heller ikke tidszoneoplysninger i datostrengen, når du bruger tidszoneparameteren.
onNull
Parameter
onNull
parameter kan bruges til at angive, hvad der skal returneres, hvis datoen er nul eller ikke eksisterer.
Værdien givet til onNull
parameter kan være et hvilket som helst gyldigt udtryk.
Antag, at vi har et dokument som dette:
{ "_id" : 6, "bar" : null }
Vi kunne bruge onNull
på følgende måde:
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 dette tilfælde var datoen null
og så inkluderer outputdokumentet den streng, som jeg har angivet for onNull
parameter.
onError
Parameter
Du kan valgfrit bruge onError
parameter for at give et udtryk til output i tilfælde af, at der opstår en fejl.
Antag, at vores samling indeholder følgende dokument:
{ "_id" : 7, "bar" : "21st Dec, 2030" }
Selvom der er en dato i bar
felt, er det ikke en gyldig dato/tidsstreng, og det vil derfor forårsage en fejl, hvis vi bruger dateFromString
for at prøve at konvertere det til et datoobjekt.
Eksempel på fejl:
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 er en grim fejl.
Vi kan bruge onError
parameter for at få det til at se pænere ud:
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
og onError
parametre giver os mulighed for at returnere de faktiske dokumenter, de giver os mulighed for at returnere flere dokumenter uden at bekymre os om, at et dårligt dokument stopper hele operationen.
Eksempel:
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" }