sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB $isoWeek

V MongoDB, $isoWeek operátor agregačního kanálu vrátí číslo týdne ve formátu ISO 8601 v rozsahu od 153 .

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.


  1. Jak porovnat MongoDB s YCSB?

  2. Vícenásobné použití pozičního operátoru `$` k aktualizaci vnořených polí

  3. Redis, bude téma (pub/sub) vždy doručeno alespoň jednomu předplatiteli?

  4. Redis Vue Desktop