sql >> Database >  >> NoSQL >> MongoDB

MongoDB $isoWeekYear

In MongoDB, het $isoWeekYear aggregatiepijplijnbeheerder retourneert het ISO-weeknummeringsjaar voor een bepaalde datumwaarde. Dit is het jaartal in ISO 8601-formaat.

Bij gebruik van de $isoWeekYear operator, kunt u optioneel een tijdzone specificeren die voor het resultaat moet worden gebruikt.

Het $isoWeekYear operator accepteert een datum (als een datum, een tijdstempel of een object-ID) of een document dat de te gebruiken datum en tijdzone specificeert.

Voorbeeld

Stel dat we een verzameling hebben met de naam cats met het volgende document:

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

We kunnen de volgende code uitvoeren om het ISO-jaar te extraheren uit de born veld in dat document.

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

Resultaat:

{ "birthIsoWeekYear" : NumberLong(2020) } 

We kunnen zien dat het ISO-jaar eigenlijk 2020 is, hoewel de datum 2021 aangeeft. Dit komt omdat het ISO-jaar pas eindigt als de laatste week is afgelopen. En in dit geval begon de week aan het einde van het voorgaande jaar en moet hij nog eindigen. Dit is hoe ISO-jaren werken.

Hier gebruikte ik birthIsoWeekYear als de veldnaam die moet worden geretourneerd, maar dit kan van alles zijn (zoals isoWeekYear , isoYear , enzovoort).

De _id veld wordt standaard geretourneerd bij het gebruik van projecties in MongoDB, maar in dit voorbeeld heb ik de _id expliciet verborgen veld met _id: 0 .

Geef een tijdzone op

U kunt een tijdzone specificeren die moet worden gebruikt voor de uitvoer van het $isoWeekYear telefoniste.

Wanneer u dit doet, wordt het argument doorgegeven aan $isoWeekYear moet de volgende vorm hebben:

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

Waar <dateExpression> is de te gebruiken datum, en <tzExpression> is de te gebruiken tijdzone.

De tijdzone kan worden opgegeven met behulp van de Olson-tijdzone-ID (bijv. "Europe/London" , "GMT" ) of de UTC-offset (bijv. "+02:30" , "-1030" ).

Olson tijdzone-ID

Hier is een voorbeeld dat het ISO-jaar in twee verschillende tijdzones uitvoert, elk met de Olson-tijdzone-ID's:

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

Resultaat:

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

In dit geval gaat de datum vooruit naar het volgende ISO-jaar bij gebruik van de Pacific/Auckland tijdzone.

UTC-offset

Hier is hetzelfde voorbeeld, behalve dat we deze keer de UTC-offset gebruiken.

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

Resultaat:

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

Retourneer het ISO-jaar van een ObjectId

U kunt $isoWeekYear . gebruiken om het ISO-jaargedeelte van een ObjectId te retourneren.

ObjectId-waarden zijn hexadecimale waarden van 12 bytes die bestaan ​​uit:

  • Een tijdstempelwaarde van 4 byte, die de creatie van de ObjectId vertegenwoordigt, gemeten in seconden sinds het Unix-tijdperk.
  • Een 5 byte is een willekeurige waarde
  • Een oplopende teller van 3 bytes, geïnitialiseerd op een willekeurige waarde.

Samenvattend ziet ons document er als volgt uit:

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

Dit document bevat een ObjectId. We kunnen daarom $isoWeekYear . gebruiken om het ISO-jaar terug te geven waarin ons document is gemaakt (of meer specifiek, wanneer de _id de ObjectId-waarde van het veld is gemaakt).

Voorbeeld:

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

Resultaat:

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

We kunnen zien dat het document is gemaakt in het ISO-jaar 2021.

In dit geval heb ik ook de $toDate . gebruikt aggregatiepijplijnoperator om het tijdstempelgedeelte van de ObjectId te retourneren.

Over het ISO-weekdatumsysteem

Het ISO-weekdatumsysteem is een kalendersysteem dat deel uitmaakt van de ISO 8601-norm voor datum en tijd uitgegeven door de International Organization for Standardization (ISO). Het systeem specificeert een weekjaar bovenop de Gregoriaanse kalender door een notatie te definiëren voor ordinale weken van het jaar.

ISO-weeknummeringsjaren hebben 52 of 53 volle weken. Dit betekent dat er 364 of 371 dagen in het jaar zitten, in plaats van de gebruikelijke 365 of 366 dagen.

ISO-weken beginnen met maandag. Het jaar van elke ISO-week is het Gregoriaanse jaar waarin de donderdag valt. ISO-weeknummers beginnen bij 1 met de week die de eerste donderdag van het jaar bevat.


  1. MongoDB:Subdocument bijwerken

  2. Spring Boot met Session/Redis-serialisatiefout met slechte Active Directory Ldap-referenties

  3. MongoDB NOW Aggregatievariabele

  4. MongoDB-normalisatie, externe sleutel en samenvoegen