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

MongoDB $isoWeekYear

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.


  1. Socket.io, Redis Store a IE

  2. MongoDB – A co desetinný typ hodnoty?

  3. Spuštění Redis na Travis CI

  4. MongoDb - Využití multi CPU server pro zápis náročné aplikace