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") }