V MongoDB, $dateToString
operátor agregačního kanálu převede daný objekt data na řetězec.
$dateToString
operátor přijímá datum, časové razítko nebo ObjectId.
Zadáním specifikace formátu můžete určit formát, který se má použít pro výsledek. Specifikace formátu může být libovolný řetězcový literál obsahující 0 nebo více specifikátorů formátu.
Specifikace formátu je volitelná od MongoDB verze 4.0, když featureCompatibilityVersion
je nastaven na 4.0
nebo vyšší. Starší verze vyžadují specifikaci formátu.
Volitelně můžete použít timezone
parametr k určení časového pásma, které se má použít.
Můžete také použít onNull
parametr určující, co se má vrátit, pokud je datum null
nebo chybí.
Příklad
Předpokládejme, že máme sbírku nazvanou pets
s následujícím dokumentem:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "name" : "Fetch", "born" : ISODate("2020-12-31T23:30:15.123Z") }
Můžeme spustit následující kód a vrátit řetězec data z born
pole v tomto dokumentu.
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateString: { $dateToString: { format: "%Y-%m-%dT%H:%M:%S.%LZ", date: "$born" } }
}
}
]
)
Výsledek:
{ "dateString" : "2020-12-31T23:30:15.123Z" }
Tento příklad používá %Y-%m-%dT%H:%M:%S.%LZ
jako specifikace formátu. Toto je náhodou výchozí specifikace formátu, ale v tomto případě jsme ji výslovně specifikovali. Vidíme, že řetězec data je vrácen v zadaném formátu.
Zde jsem použil dateString
jako název pole, které se má vrátit, ale mohlo to být cokoliv (například formattedDate
, theDate
atd).
_id
pole je vráceno ve výchozím nastavení při použití projekcí v MongoDB, ale v tomto příkladu jsem explicitně skryl _id
pole pomocí _id: 0
.
Viz MongoDB $dateToString
Specifikátory formátu pro seznam dostupných specifikátorů formátu.
Výchozí výstup
Jak již bylo zmíněno, specifikace formátu v předchozím příkladu je výchozí specifikací formátu.
Pokud používáte MongoDB verze 4.0 nebo vyšší, s featureCompatibilityVersion
nastavte na 4.0
nebo vyšší (viz, jak zobrazit aktuální featureCompatibilityVersion
a jak to nastavit), můžete specifikaci formátu vynechat, pokud chcete, aby bylo datum formátováno pomocí výše uvedeného formátu.
Proto bychom mohli přepsat předchozí. příklad k tomuto:
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateString: { $dateToString: { date: "$born" } }
}
}
]
)
Výsledek:
{ "dateString" : "2020-12-31T23:30:15.123Z" }
Zadejte časové pásmo
Můžete zadat časové pásmo, které se použije pro výstup $dateToString
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.pets.aggregate(
[
{
$project: {
_id: 0,
UTC: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "UTC" } },
Honolulu: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "Pacific/Honolulu" } },
Auckland: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "Pacific/Auckland" } }
}
}
]
).pretty()
Výsledek:
{ "UTC" : "2020-12-31T23:30", "Honolulu" : "2020-12-31T13:30", "Auckland" : "2021-01-01T12:30" }
Posun UTC
Zde je příklad, který používá offset UTC.
db.pets.aggregate(
[
{
$project: {
_id: 0,
UTC: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "+00:00" } },
Honolulu: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "-10:00" } },
Auckland: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "+12:00" } }
}
}
]
).pretty()
Výsledek:
{ "UTC" : "2020-12-31T23:30", "Honolulu" : "2020-12-31T13:30", "Auckland" : "2021-01-01T11:30" }
Formát data týdne podle ISO
Existuje několik specifikátorů formátu, které umožňují výstup řetězce data ve 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 sbírku nazvanou cats
s následujícím dokumentem:
{ "_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"), "name" : "Scratch", "born" : ISODate("2021-01-03T23:30:15.123Z") }
Můžeme spustit následující kód a extrahovat pole data ISO z born
pole v tomto dokumentu.
Zde je příklad k demonstraci:
db.cats.aggregate(
[
{
$project: {
_id: 0,
isoYear: { $dateToString: { format: "%G", date: "$born" } },
isoDayOfWeek: { $dateToString: { format: "%u", date: "$born" } },
isoWeekOfYear: { $dateToString: { format: "%V", date: "$born" } }
}
}
]
)
Výsledek:
{ "isoYear" : "2020", "isoDayOfWeek" : "7", "isoWeekOfYear" : "53" }
Naproti tomu níže je stejný příklad, ale s použitím částí data týdne, které nejsou ISO.
db.cats.aggregate(
[
{
$project: {
_id: 0,
year: { $dateToString: { format: "%Y", date: "$born" } },
dayofweek: { $dateToString: { format: "%w", date: "$born" } },
weekofyear: { $dateToString: { format: "%U", date: "$born" } }
}
}
]
)
Výsledek:
{ "year" : "2021", "dayofweek" : "1", "weekofyear" : "01" }
Vidíme, že výsledek je úplně jiný.
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.
Zde je příklad:
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateString: { $dateToString: { date: null, onNull: "No date supplied" } }
}
}
]
)
Výsledek:
{ "dateString" : "No date supplied" }
V tomto případě bylo datum null
a tak výstupní dokument obsahuje řetězec, který jsem poskytl pro onNull
parametr.
Vrátí části data z ObjectId
Můžete použít $dateToString
vrátit řetězec data z ObjectId.
Hodnoty ObjectId jsou 12bajtové hexadecimální hodnoty, které se skládají z:
- Čtyřbajtová hodnota časového razítka představující vytvoření ObjectId, měřená v sekundách od epochy Unixu.
- 5 bajtů je náhodná hodnota
- 3bajtový inkrementační čítač, inicializovaný na náhodnou hodnotu.
Abychom to shrnuli, náš první dokument vypadá takto:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "name" : "Fetch", "born" : ISODate("2020-12-31T23:30:15.123Z") }
Tento dokument obsahuje ObjectId. Můžeme tedy použít $dateToString
vrátit řetězec data na základě data, kdy byl náš dokument vytvořen (nebo konkrétněji, když _id
byla vytvořena hodnota ObjectId pole).
Příklad:
db.pets.aggregate(
[
{
$project: {
timestamp: { $toDate: "$_id" },
dateString: { $dateToString: { format: "%d-%m-%Y", date: "$_id" } }
}
}
]
).pretty()
Výsledek:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "timestamp" : ISODate("2021-01-19T01:11:35Z"), "dateString" : "19-01-2021" }
V tomto případě jsem se rozhodl vrátit pouze datovou část (nikoli časovou). Také jsem změnil pořadí dnů, měsíců a roku, abych ukázal, že to v případě potřeby určitě můžete udělat.
Také jsem použil $toDate
operátor agregačního kanálu, aby vrátil část ObjectId s časovým razítkem.