sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $isoWeek

I MongoDB, $isoWeek aggregeringspipeline-operatören returnerar veckonummer i ISO 8601-format, från 1 till 53 .

När du använder $isoWeek operatör kan du valfritt ange en tidszon som ska användas för resultatet.

$isoWeek operatören accepterar antingen ett datum (som antingen ett datum, en tidsstämpel eller ett objekt-ID), eller ett dokument som anger datum och tidszon som ska användas.

Exempel

Anta att vi har en samling som heter cats med följande dokument:

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

Vi kan köra följande kod för att extrahera ISO-veckan från born fältet i det dokumentet.

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

Resultat:

{ "birthIsoWeek" : 53 } 

Vi kan se att ISO-veckan faktiskt är 53, trots att datumet är i januari. Detta beror på att veckan började i slutet av föregående år och ännu inte är slut. Så här fungerar ISO-veckor.

Här använde jag birthIsoWeek som fältnamnet att returnera, men detta kunde ha varit vad som helst (som isoWeek , week , etc).

_id fältet returneras som standard när man använder projektioner i MongoDB, men i det här exemplet gömde jag uttryckligen _id fält med _id: 0 .

Ange en tidszon

Du kan ange en tidszon som ska användas för utdata från $isoWeek operatör.

När du gör detta skickades argumentet till $isoWeek måste vara av följande form:

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

Där <dateExpression> är datumet att använda och <tzExpression> är tidszonen som ska användas.

Tidszonen kan specificeras med antingen Olsons tidszonsidentifierare (t.ex. "Europe/London" , "GMT" ) eller UTC-offset (t.ex. "+02:30" , "-1030" ).

Olsons tidszonsidentifierare

Här är ett exempel som matar ut ISO-veckan i två olika tidszoner, var och en med hjälp av Olsons tidszons-ID:

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

Resultat:

{ "honolulu" : 53, "auckland" : 1 } 

I det här fallet flyttas datumet framåt till nästa ISO-vecka när du använder Pacific/Auckland tidszon.

UTC-offset

Här är samma exempel, förutom den här gången använder vi UTC-offset.

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

Resultat:

{ "utcOffset-1000" : 53, "utcOffset+1200" : 1 }

Återställ ISO-veckan från ett ObjectId

Du kan använda $isoWeek för att returnera ISO-veckodelen från ett ObjectId.

ObjectId-värden är hexadecimala värden på 12 byte som består av:

  • Ett tidsstämpelvärde på 4 byte, som representerar objekt-ID:ts skapelse, mätt i sekunder sedan Unix-epoken.
  • En 5 byte är ett slumpmässigt värde
  • En 3-byte inkrementerande räknare, initierad till ett slumpmässigt värde.

För att sammanfatta ser vårt dokument ut så här:

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

Detta dokument innehåller ett ObjectId. Vi kan därför använda $isoWeek för att returnera ISO-veckan som vårt dokument skapades (eller mer specifikt, när _id fältets ObjectId-värde skapades).

Exempel:

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

Resultat:

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

Vi kan se att dokumentet skapades den 3:e veckan på året när vi använder ISO 8601-formatet.

I det här fallet använde jag också $toDate aggregeringspipeline-operatör för att returnera tidsstämpeldelen av ObjectId.

Vad är en ISO-vecka?

ISO-veckodatumsystemet är ett kalendersystem som är en del av ISO 8601-standarden för datum och tid som utfärdats av International Organization for Standardization (ISO). Systemet specificerar ett veckoår ovanpå den gregorianska kalendern genom att definiera en notation för ordinarie veckor på året.

ISO-veckor har antingen 52 eller 53 hela veckor. Det betyder att det finns antingen 364 eller 371 dagar på året, istället för de vanliga 365 eller 366 dagar.

ISO-veckorna börjar med måndag. Varje ISO-veckas år är det gregorianska år då torsdagen infaller. ISO-veckonummer börjar på 1 med veckan som innehåller årets första torsdag.


  1. MongoDB - Skillnad mellan index på textfält och textindex?

  2. Få Set value från Redis med RedisTemplate

  3. Kunde inte ansluta till Redis på 127.0.0.1:6379:Anslutning nekades med hembryggning

  4. Hierarkiska frågor med Mongo med $graphLookup