V MongoDB, $dateFromParts
Operátor agregačního kanálu vytvoří a vrátí objekt Date z jednotlivých částí data.
Každou část data poskytujete jako samostatné pole.
V případě potřeby můžete zadat pole pro datum ve formátu ISO týdne.
Příklad
Předpokládejme, že máme kolekci nazvanou dateParts
s následujícím dokumentem:
{ "_id" : 1, "year" : 2020, "month" : 12, "day" : 31, "hour" : 23, "minute" : 30, "second" : 25, "millisecond" : 123 }
Dokument obsahuje pro každou část data jiné pole.
Můžeme spustit následující kód a vrátit objekt data z polí v těchto dokumentech.
db.dateParts.aggregate([
{
$project: {
date: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond"
}
}
}
}])
Výsledek:
{ "_id" : 1, "date" : ISODate("2020-12-31T23:30:25.123Z") }
Všechny části data/času byly převedeny na jeden objekt data.
Časová pásma
Můžete použít timezone
pole pro zadání časového pásma.
Č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, který používá Olson ID časového pásma k výstupu tří různých dat z jednoho dokumentu na základě tří různých časových pásem.
db.dateParts.aggregate([
{
$project: {
dateUTC: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "Pacific/Auckland"
}
},
dateHonolulu: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "Pacific/Honolulu"
}
},
dateAuckland: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "Pacific/Auckland"
}
}
}
}]).pretty()
Výsledek:
{ "_id" : 1, "dateUTC" : ISODate("2020-12-31T10:30:25.123Z"), "dateHonolulu" : ISODate("2021-01-01T09:30:25.123Z"), "dateAuckland" : ISODate("2020-12-31T10:30:25.123Z") }
Posun UTC
Zde je příklad, který používá offset UTC.
db.dateParts.aggregate([
{
$project: {
"date+00:00": {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "+00:00"
}
},
"date-10:00": {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "-10:00"
}
},
"date+12:00": {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"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") }
Formát data týdne podle ISO
Části data lze v případě potřeby specifikovat pomocí formátu ISO 8601.
Konkrétně můžete použít:
Specifikátor formátu | Výstup |
---|---|
isoWeekYear | Rok ve formátu ISO 8601. Toto pole je povinné, pokud nepoužíváte year (a year je vyžadováno, pokud nepoužíváte isoWeekYear ). |
isoWeek | Týden v roce ve formátu ISO 8601. Lze použít pouze s isoWeekYear . |
isoDayOfWeek | Den v týdnu (1–pondělí, 7–neděle). Lze použít pouze s isoWeekYear . |
Předpokládejme, že vložíme druhý dokument, který vypadá takto:
{ "_id" : 2, "isoWeekYear" : 2021, "isoWeek" : 32, "isoDayOfWeek" : 7, "hour" : 23, "minute" : 30, "second" : 25, "millisecond" : 123, "timezone" : "UTC" }
Vidíme, že používá isoWeekYear
, isoWeek
a isoDayOfWeek
místo year
, month
a day
(což je to, co používá první dokument).
K vytvoření objektu Date z tohoto dokumentu můžeme použít následující kód:
db.dateParts.aggregate([
{ $match: { _id: 2} },
{
$project: {
date: {
$dateFromParts: {
"isoWeekYear": "$isoWeekYear",
"isoWeek": "$isoWeek",
"isoDayOfWeek": "$isoDayOfWeek",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "$timezone"
}
}
}
}
])
Výsledek:
{ "_id" : 2, "date" : ISODate("2021-08-15T23:30:25.123Z") }
Pole mimo rozsah
Počínaje MongoDB 4.4, podporovaný rozsah hodnot pro year
a isoWeekYear
je 1-9999
. V předchozích verzích byla spodní hranice těchto hodnot 0
a podporovaný rozsah hodnot byl 0-9999
.
Počínaje MongoDB 4.0, pokud je hodnota určena pro jiná pole než year
, isoWeekYear
a timezone
je mimo platný rozsah, $dateFromParts
operátor přenese nebo odečte rozdíl od ostatních částí data pro výpočet data.
Hodnoty vyšší než rozsah
Předpokládejme, že do naší sbírky přidáme následující dokument:
{ "_id" : 3, "year" : 2020, "month" : 14, "day" : 65, "hour" : 48, "minute" : 130, "second" : 625, "millisecond" : 123 }
Mnoho polí data a času v tomto dokumentu je vyšší než jejich příslušné platné rozsahy.
Spusťte následující příkaz, který jej převede na objekt Date:
db.dateParts.aggregate([
{ $match: { _id: 3} },
{
$project: {
date: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond"
}
}
}
}
])
Výsledek:
{ "_id" : 3, "date" : ISODate("2021-04-08T02:20:25.123Z") }
Můžeme vidět, že části data ve výsledném objektu Date se liší od příslušných částí data v dokumentu. Důvodem je $dateFromParts
přepočítal datum, aby zohlednil hodnoty části data, které přesáhly jejich normální rozsah.
Hodnoty nižší než rozsah
Předpokládejme, že do naší sbírky přidáme následující dokument:
{ "_id" : 4, "year" : 2020, "month" : 0, "day" : 0, "hour" : 0, "minute" : 0, "second" : 0, "millisecond" : 0 }
Mnohá pole data a času v tomto dokumentu jsou nižší než jejich příslušné platné rozsahy.
Spusťte následující příkaz, který jej převede na objekt Date:
db.dateParts.aggregate([
{ $match: { _id: 4} },
{
$project: {
date: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond"
}
}
}
}
])
Výsledek:
{ "_id" : 4, "date" : ISODate("2019-11-30T00:00:00Z") }