V MongoDB, $isoWeekYear
operátor agregačního kanálu vrátí rok číslování týdnů podle normy ISO pro danou hodnotu data. Toto je číslo roku ve formátu ISO 8601.
Při použití $isoWeekYear
operátor, můžete volitelně zadat časové pásmo, které se má použít pro výsledek.
$isoWeekYear
operátor přijímá buď datum (jako datum, časové razítko nebo ObjectId), nebo dokument, který určuje datum a časové pásmo, které se má použít.
Příklad
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 rok ISO z born
pole v tomto dokumentu.
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthIsoWeekYear: { $isoWeekYear: "$born" }
}
}
]
)
Výsledek:
{ "birthIsoWeekYear" : NumberLong(2020) }
Můžeme vidět, že rok ISO je ve skutečnosti 2020, i když datum uvádí rok 2021. Je to proto, že rok ISO nekončí, dokud neskončí poslední týden. A v tomto případě týden začal na konci předchozího roku a ještě neskončil. Takto fungují roky ISO.
Zde jsem použil birthIsoWeekYear
jako název pole, které se má vrátit, ale mohlo to být cokoliv (například isoWeekYear
, isoYear
, 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
.
Zadejte časové pásmo
Můžete zadat časové pásmo, které se použije pro výstup $isoWeekYear
operátor.
Když to uděláte, argument se předá do $isoWeekYear
musí mít následující tvar:
{ date: <dateExpression>, timezone: <tzExpression> }
Kde <dateExpression>
je datum použití a <tzExpression>
je časové pásmo, které se má použít.
Č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ý zobrazuje ISO rok ve dvou různých časových pásmech, každé s použitím Olsonových ID časových pásem:
db.cats.aggregate(
[
{
$project: {
_id: 0,
honolulu: {
$isoWeekYear: { date: "$born", timezone: "Pacific/Honolulu" }
},
auckland: {
$isoWeekYear: { date: "$born", timezone: "Pacific/Auckland" }
}
}
}
]
)
Výsledek:
{ "honolulu" : NumberLong(2020), "auckland" : NumberLong(2021) }
V tomto případě se při použití Pacific/Auckland
datum posune dopředu na další rok ISO časové pásmo.
Posun UTC
Zde je stejný příklad, ale tentokrát používáme posun UTC.
db.cats.aggregate(
[
{
$project: {
_id: 0,
"utcOffset-1000": {
$isoWeekYear: { date: "$born", timezone: "-1000" }
},
"utcOffset+1200": {
$isoWeekYear: { date: "$born", timezone: "+1200" }
}
}
}
]
)
Výsledek:
{ "utcOffset-1000" : NumberLong(2020), "utcOffset+1200" : NumberLong(2021) }
Vrátí rok ISO z ObjectId
Můžete použít $isoWeekYear
vrátit část ISO roku 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áš dokument vypadá takto:
{ "_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"), "name" : "Scratch", "born" : ISODate("2021-01-03T23:30:15.123Z") }
Tento dokument obsahuje ObjectId. Můžeme tedy použít $isoWeekYear
vrátit rok ISO, ve kterém byl náš dokument vytvořen (nebo konkrétněji, když _id
byla vytvořena hodnota ObjectId pole).
Příklad:
db.cats.aggregate(
[
{
$project:
{
"timeStamp": { $toDate: "$_id"},
"isoWeekYear": { $isoWeekYear: "$_id" }
}
}
]
).pretty()
Výsledek:
{ "_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"), "timeStamp" : ISODate("2021-01-21T00:24:05Z"), "isoWeekYear" : NumberLong(2021) }
Vidíme, že dokument byl vytvořen v roce ISO 2021.
V tomto případě jsem také použil $toDate
operátor agregačního kanálu, aby vrátil část ObjectId s časovým razítkem.
O týdenním datovém systému ISO
Systém týdenního data ISO je kalendářní systém, který je součástí normy ISO 8601 pro datum a čas vydané Mezinárodní organizací pro normalizaci (ISO). Systém určuje týdenní rok nad gregoriánským kalendářem tím, že definuje zápis pro řadové týdny v roce.
ISO roky číslování týdnů mají buď 52 nebo 53 celých týdnů. To znamená, že rok má buď 364 nebo 371 dní namísto obvyklých 365 nebo 366 dní.
Týdny ISO začínají pondělím. Rok každého týdne ISO je gregoriánský rok, do kterého spadá čtvrtek. Čísla týdnů ISO začínají na 1
s týdnem, který obsahuje první čtvrtek roku.