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.