sql >> Database >  >> NoSQL >> MongoDB

MongoDB $isoWeek

In MongoDB, de $isoWeek aggregatiepijplijnoperator retourneert het weeknummer in ISO 8601-indeling, variërend van 1 tot 53 .

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

De $isoWeek 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 de ISO-week te extraheren uit de born veld in dat document.

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

Resultaat:

{ "birthIsoWeek" : 53 } 

We kunnen zien dat de ISO-week eigenlijk 53 is, ook al is de datum in januari. Dit komt omdat de week eind vorig jaar begon en nog niet is afgelopen. Zo werken ISO-weken.

Hier gebruikte ik birthIsoWeek als de veldnaam die moet worden geretourneerd, maar dit kan van alles zijn (zoals isoWeek , week , 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 de $isoWeek telefoniste.

Wanneer u dit doet, wordt het argument doorgegeven aan $isoWeek 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 de ISO-week in twee verschillende tijdzones uitvoert, elk met de Olson-tijdzone-ID's:

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

Resultaat:

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

In dit geval gaat de datum vooruit naar de volgende ISO-week 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": { 
            $isoWeek: { date: "$born", timezone: "-1000" }
            },
          "utcOffset+1200": { 
            $isoWeek: { date: "$born", timezone: "+1200" }
            }
        }
    }
  ]
)

Resultaat:

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

Retourneer de ISO-week van een ObjectId

U kunt $isoWeek . gebruiken om het ISO-weekgedeelte 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 $isoWeek . gebruiken om de ISO-week 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"},
          "isoWeek": { $isoWeek: "$_id" }
        }
    }
  ]
).pretty()

Resultaat:

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

We kunnen zien dat het document in de 3e week van het jaar is gemaakt bij gebruik van het ISO 8601-formaat.

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

Wat is een ISO-week?

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. Binnenste array-elementen uit meerdere documenten in gesorteerde vorm retourneren

  2. Versleuteling gebruiken om uw MongoDB-gegevens te beschermen

  3. MongoDB's prestaties op aggregatiequery's

  4. Hoe krijg ik toegang tot Meteor's MongoDB vanaf een andere client, terwijl Meteor actief is?