sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $isoWeekYear

I MongoDB, $isoWeekYear aggregeringspipeline-operatören returnerar ISO-veckonummeråret för ett givet datumvärde. Detta är årstalet i ISO 8601-format.

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

$isoWeekYear 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-året från born fältet i det dokumentet.

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

Resultat:

{ "birthIsoWeekYear" : NumberLong(2020) } 

Vi kan se att ISO-året faktiskt är 2020, även om datumet anger 2021. Detta beror på att ISO-året inte slutar förrän den sista veckan är slut. Och i det här fallet började veckan i slutet av föregående år och har ännu inte avslutats. Så här fungerar ISO-år.

Här använde jag birthIsoWeekYear som fältnamnet att returnera, men detta kan ha varit vad som helst (som isoWeekYear , isoYear , 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 $isoWeekYear operatör.

När du gör detta skickades argumentet till $isoWeekYear 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-året i två olika tidszoner, var och en med hjälp av Olsons tidszons-ID:

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 det här fallet flyttas datumet framåt till nästa ISO-år 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": { 
            $isoWeekYear: { date: "$born", timezone: "-1000" }
            },
          "utcOffset+1200": { 
            $isoWeekYear: { date: "$born", timezone: "+1200" }
            }
        }
    }
  ]
)

Resultat:

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

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

Du kan använda $isoWeekYear för att returnera ISO-årsdelen 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 $isoWeekYear för att returnera ISO-året 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"},
          "isoWeekYear": { $isoWeekYear: "$_id" }
        }
    }
  ]
).pretty()

Resultat:

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

Vi kan se att dokumentet skapades under ISO-året 2021.

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

Om ISO Week Date System

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. Använder operatorn $slice för att få det sista elementet i arrayen

  2. MongoDB-miljöinställningar | Installera MongoDB på Windows

  3. Få meddelande om ändrade dokument i mongodb

  4. Hur returnerar man Redis primaryKey via ARM-mallutgång?