V MongoDB, $isoWeek
operátor agregačního kanálu vrátí číslo týdne ve formátu ISO 8601 v rozsahu od 1
až 53
.
Při použití $isoWeek
operátor, můžete volitelně zadat časové pásmo, které se má použít pro výsledek.
$isoWeek
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 týden ISO z born
pole v tomto dokumentu.
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthIsoWeek: { $isoWeek: "$born" }
}
}
]
)
Výsledek:
{ "birthIsoWeek" : 53 }
Vidíme, že týden ISO je ve skutečnosti 53, i když datum je v lednu. Je to proto, že týden začal na konci předchozího roku a ještě neskončil. Takto fungují týdny ISO.
Zde jsem použil birthIsoWeek
jako název pole, které se má vrátit, ale mohlo to být cokoliv (například isoWeek
, week
, 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 $isoWeek
operátor.
Když to uděláte, argument se předá do $isoWeek
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 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ý vydává týden ISO 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: {
$isoWeek: { date: "$born", timezone: "Pacific/Honolulu" }
},
auckland: {
$isoWeek: { date: "$born", timezone: "Pacific/Auckland" }
}
}
}
]
)
Výsledek:
{ "honolulu" : 53, "auckland" : 1 }
V tomto případě se při použití Pacific/Auckland
datum posune dopředu na další týden 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": {
$isoWeek: { date: "$born", timezone: "-1000" }
},
"utcOffset+1200": {
$isoWeek: { date: "$born", timezone: "+1200" }
}
}
}
]
)
Výsledek:
{ "utcOffset-1000" : 53, "utcOffset+1200" : 1 }
Vraťte týden ISO z ObjectId
Můžete použít $isoWeek
vrátíte část týdne ISO 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 $isoWeek
vrátit týden 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"},
"isoWeek": { $isoWeek: "$_id" }
}
}
]
).pretty()
Výsledek:
{ "_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"), "timeStamp" : ISODate("2021-01-21T00:24:05Z"), "isoWeek" : 3 }
Vidíme, že dokument byl vytvořen 3. týden v roce při použití formátu ISO 8601.
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.
Co je to týden 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. Každý rok 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.