V MongoDB, $dateFromString
operátor agregačního kanálu převede řetězec data/času na objekt data.
Příklad
Předpokládejme, že máme kolekci nazvanou foo
s následujícími dokumenty:
{ "_id" : 1, "bar" : "2020-12-31T23:30:25.123" } { "_id" : 2, "bar" : "2020-12-31" } { "_id" : 3, "bar" : "2020-12-31T23:30" }
Všechny dokumenty obsahují řetězec data/času.
Můžeme spustit následující kód a vrátit objekt data z bar
pole v těchto dokumentech.
db.foo.aggregate([
{
$project: {
date: {
$dateFromString: {
dateString: '$bar'
}
}
}
}
])
Výsledek:
{ "_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") }
Všechny řetězce data/času byly převedeny na objekt data.
Také jsem změnil název pole z bar
do date
.
Zadejte formát
Můžete zadat volitelný format
argument k určení formátu řetězce data/času, který je poskytnut. Specifikace formátu může být libovolný řetězcový literál obsahující 0 nebo více specifikátorů formátu.
format
parametr je dostupný od MongoDB verze 4.0.
Výchozí formát je %Y-%m-%dT%H:%M:%S.%LZ
, což je to, co používá předchozí příklad.
Předpokládejme, že do naší sbírky vložíme následující dokument:
{ "_id" : 4, "bar" : "07/08/2020" }
V tomto případě může být datem 7. den 8. měsíce nebo 8. den 7. měsíce v závislosti na používaném národním prostředí.
Můžeme použít specifikaci formátu, abychom přesně určili, který by to měl být.
Příklad:
db.foo.aggregate([
{ $match: { _id: 4 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
format: "%m/%d/%Y"
}
}
}
}
])
Výsledek:
{ "_id" : 4, "date" : ISODate("2020-07-08T00:00:00Z") }
V tomto případě jsme uvedli, že se jedná o 8. den 7. měsíce.
Je to tu znovu, ale tentokrát jsme si vyměnili den a měsíc.
db.foo.aggregate([
{ $match: { _id: 4 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
format: "%d/%m/%Y"
}
}
}
}
])
Výsledek:
{ "_id" : 4, "date" : ISODate("2020-08-07T00:00:00Z") }
Tentokrát je to interpretováno jako 7. den 8. měsíce.
Viz MongoDB $dateFromString
Specifikátory formátu pro seznam platných specifikátorů formátu.
Formát data týdne podle ISO
Existuje několik specifikátorů formátu, které vám umožňují určit data pomocí formátu ISO 8601.
Konkrétně můžete použít:
Specifikátor formátu | Výstup |
---|---|
%G | Rok ve formátu ISO 8601 |
%u | Číslo dne v týdnu ve formátu ISO 8601 (1–pondělí, 7–neděle) |
%V | Týden roku ve formátu ISO 8601 |
Předpokládejme, že máme dokument, který vypadá takto:
{ "_id" : 5, "bar" : "7-8-2020" }
Toto datum bychom mohli interpretovat jako 7. den v týdnu ISO, po kterém následuje 8. týden ISO v roce a po něm rok.
Takhle:
db.foo.aggregate([
{ $match: { _id: 5 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
format: "%u-%V-%G"
}
}
}
}
])
Výsledek:
{ "_id" : 5, "date" : ISODate("2020-02-23T00:00:00Z") }
Zadejte časové pásmo
Pomocí $dateFromString
můžete zadat časové pásmo, které se má použít operátor.
Časové pásmo lze zadat buď pomocí identifikátoru časového pásma Olson (např. "Europe/London"
, "GMT"
) nebo offset UTC (např. "+02:30"
, "-1030"
).
Olsonův identifikátor časového pásma
Zde je příklad, jehož výstupem je řetězec data ve třech různých časových pásmech, z nichž každé používá ID časového pásma Olson:
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()
Výsledek:
{ "_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") }
Posun UTC
Zde je příklad, který používá offset UTC.
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()
Výsledek:
{ "_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") }
Pokud používáte timezone
parametr, nelze k datovému řetězci připojit Z pro označení Zuluského času (časové pásmo UTC). Řetězec data například nemůže být 2020-12-31T23:30:25.123Z
při použití parametru časové pásmo.
Při použití parametru timezone také do řetězce data nezahrnujte informace o časovém pásmu.
onNull
Parametr
onNull
Parametr lze použít k určení toho, co se má vrátit, pokud je datum prázdné nebo neexistuje.
Hodnota poskytnutá parametru onNull
parametr může být libovolný platný výraz.
Předpokládejme, že máme dokument jako tento:
{ "_id" : 6, "bar" : null }
Mohli bychom použít onNull
následujícím způsobem:
db.foo.aggregate([
{ $match: { _id: 6 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
onNull: "No valid date was supplied"
}
}
}
}
])
Výsledek:
{ "_id" : 6, "date" : "No valid date was supplied" }
V tomto případě bylo datum null
a tak výstupní dokument obsahuje řetězec, který jsem poskytl pro onNull
parametr.
onError
Parametr
Volitelně můžete použít onError
parametr pro poskytnutí výrazu pro výstup v případě, že dojde k chybě.
Předpokládejme, že naše sbírka obsahuje následující dokument:
{ "_id" : 7, "bar" : "21st Dec, 2030" }
I když je v bar
datum pole, není to platný řetězec data/času, a proto způsobí chybu, pokud použijeme dateFromString
pokusit se jej převést na objekt data.
Příklad chyby:
db.foo.aggregate([
{ $match: { _id: 7 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar'
}
}
}
}
])
Výsledek:
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
To je ošklivá chyba.
Můžeme použít onError
parametr, aby to vypadalo lépe:
db.foo.aggregate([
{ $match: { _id: 7 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
onError: "An error occurred while parsing the date string"
}
}
}
}
])
Výsledek:
{ "_id" : 7, "date" : "An error occurred while parsing the date string" }
Vidět jako onNull
a onError
parametry nám umožňují vrátit skutečné dokumenty, umožňují nám vrátit více dokumentů, aniž bychom se museli obávat, že jeden špatný dokument zastaví celou operaci.
Příklad:
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"
}
}
}
}
])
Výsledek:
{ "_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" }