sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB $isoWeekYear

I MongoDB er $isoWeekYear aggregeringspipeline-operatør returnerer ISO-ugenummereringsåret for en given datoværdi. Dette er årstallet i ISO 8601-format.

Når du bruger $isoWeekYear operatør, kan du eventuelt angive en tidszone, der skal bruges til resultatet.

$isoWeekYear operatøren accepterer enten en dato (som enten en dato, et tidsstempel eller et objekt-id) eller et dokument, der angiver dato og tidszone, der skal bruges.

Eksempel

Antag, at vi har en samling kaldet cats med følgende dokument:

{
	"_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"),
	"name" : "Scratch",
	"born" : ISODate("2021-01-03T23:30:15.123Z")
}

Vi kan køre følgende kode for at udtrække ISO-året fra born felt i det pågældende dokument.

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthIsoWeekYear: { $isoWeekYear: "$born" }
        }
    }
  ]
)

Resultat:

{ "birthIsoWeekYear" : NumberLong(2020) } 

Vi kan se, at ISO-året faktisk er 2020, selvom datoen angiver 2021. Dette skyldes, at ISO-året ikke slutter, før den sidste uge slutter. Og i dette tilfælde startede ugen i slutningen af ​​det foregående år og er endnu ikke færdig. Sådan fungerer ISO-år.

Her brugte jeg birthIsoWeekYear som feltnavnet, der skal returneres, men dette kunne have været hvad som helst (såsom isoWeekYear , isoYear , etc).

_id felt returneres som standard ved brug af projektioner i MongoDB, men i dette eksempel skjulte jeg eksplicit _id felt ved hjælp af _id: 0 .

Angiv en tidszone

Du kan angive en tidszone, der skal bruges til output af $isoWeekYear operatør.

Når du gør dette, blev argumentet sendt til $isoWeekYear skal have følgende form:

{ date: <dateExpression>, timezone: <tzExpression> }

Hvor <dateExpression> er den dato, der skal bruges, og <tzExpression> er den tidszone, der skal bruges.

Tidszonen kan angives ved hjælp af enten Olsons tidszone-id (f.eks. "Europe/London" , "GMT" ) eller UTC offset (f.eks. "+02:30" , "-1030" ).

Olson Timezone Identifier

Her er et eksempel, der udlæser ISO-året i to forskellige tidszoner, hver ved hjælp af Olsons tidszone-id'er:

db.cats.aggregate(
  [
    {
      $project: {
          _id: 0,
          honolulu: { 
            $isoWeekYear: { date: "$born", timezone: "Pacific/Honolulu" }
            },
          auckland: { 
            $isoWeekYear: { date: "$born", timezone: "Pacific/Auckland" }
            }
        }
    }
  ]
)

Resultat:

{ "honolulu" : NumberLong(2020), "auckland" : NumberLong(2021) } 

I dette tilfælde flyttes datoen frem til næste ISO-år, når du bruger Pacific/Auckland tidszone.

UTC offset

Her er det samme eksempel, bortset fra at denne gang bruger vi UTC offset.

db.cats.aggregate(
  [
    {
      $project: {
          _id: 0,
          "utcOffset-1000": { 
            $isoWeekYear: { date: "$born", timezone: "-1000" }
            },
          "utcOffset+1200": { 
            $isoWeekYear: { date: "$born", timezone: "+1200" }
            }
        }
    }
  ]
)

Resultat:

{ "utcOffset-1000" : NumberLong(2020), "utcOffset+1200" : NumberLong(2021) } 

Returner ISO-året fra et ObjectId

Du kan bruge $isoWeekYear for at returnere ISO-årsdelen fra et ObjectId.

ObjectId-værdier er 12 byte hexadecimale værdier, der består af:

  • En tidsstempelværdi på 4 byte, der repræsenterer objekt-id'ets oprettelse, målt i sekunder siden Unix-epoken.
  • En 5 byte er en tilfældig værdi
  • En 3 byte-tæller, initialiseret til en tilfældig værdi.

For at opsummere ser vores dokument sådan ud:

{
	"_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"),
	"name" : "Scratch",
	"born" : ISODate("2021-01-03T23:30:15.123Z")
}

Dette dokument indeholder et ObjectId. Vi kan derfor bruge $isoWeekYear for at returnere det ISO-år, som vores dokument blev oprettet (eller mere specifikt, når _id feltets ObjectId-værdi blev oprettet).

Eksempel:

db.cats.aggregate(
  [
    {
      $project:
        {
          "timeStamp": { $toDate: "$_id"},
          "isoWeekYear": { $isoWeekYear: "$_id" }
        }
    }
  ]
).pretty()

Resultat:

{
	"_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"),
	"timeStamp" : ISODate("2021-01-21T00:24:05Z"),
	"isoWeekYear" : NumberLong(2021)
}

Vi kan se, at dokumentet blev oprettet i ISO-året 2021.

I dette tilfælde brugte jeg også $toDate aggregeringspipeline-operatør for at returnere tidsstempeldelen af ​​ObjectId.

Om ISO Week Date System

ISO-ugedatosystemet er et kalendersystem, der er en del af ISO 8601-dato- og tidsstandarden udstedt af International Organization for Standardization (ISO). Systemet specificerer et ugeår oven på den gregorianske kalender ved at definere en notation for ordinære uger af året.

ISO-ugenummereringsår har enten 52 eller 53 hele uger. Det betyder, at der enten er 364 eller 371 dage i året i stedet for de sædvanlige 365 eller 366 dage.

ISO-uger starter med mandag. Hver ISO-uges år er det gregorianske år, hvor torsdagen falder. ISO-ugenumre starter ved 1 med ugen, der indeholder årets første torsdag.


  1. Node.js, Socket.io, Redis pub/sub høj lydstyrke, lav latency vanskeligheder

  2. Kunne ikke indlæse fil eller assembly System.Runtime.CompilerServices.Unsafe

  3. Hvordan kan jeg bruge 'Not Like' operator i MongoDB

  4. Rate-Limit an API (spring MVC)