MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

MongoDB $isoWeek

W MongoDB $isoWeek Operator potoku agregacji zwraca numer tygodnia w formacie ISO 8601, od 1 do 53 .

Podczas korzystania z $isoWeek operatora, możesz opcjonalnie określić strefę czasową, która będzie używana dla wyniku.

$isoWeek operator akceptuje datę (jako Date, Timestamp lub ObjectId) lub dokument określający datę i strefę czasową do użycia.

Przykład

Załóżmy, że mamy kolekcję o nazwie cats z następującym dokumentem:

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

Możemy uruchomić następujący kod, aby wyodrębnić tydzień ISO z born pole w tym dokumencie.

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

Wynik:

{ "birthIsoWeek" : 53 } 

Widzimy, że tydzień ISO to w rzeczywistości 53, mimo że data jest w styczniu. Dzieje się tak dlatego, że tydzień rozpoczął się pod koniec zeszłego roku i jeszcze się nie skończył. Tak działają tygodnie ISO.

Tutaj użyłem birthIsoWeek jako nazwę pola do zwrócenia, ale może to być cokolwiek (na przykład isoWeek , week itp.).

_id pole jest domyślnie zwracane podczas korzystania z projekcji w MongoDB, ale w tym przykładzie jawnie ukryłem _id pole przy użyciu _id: 0 .

Określ strefę czasową

Możesz określić strefę czasową, która będzie używana na wyjściu $isoWeek operatora.

Gdy to zrobisz, argument zostanie przekazany do $isoWeek musi mieć następującą formę:

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

Gdzie <dateExpression> to data do użycia, a <tzExpression> to strefa czasowa do użycia.

Strefę czasową można określić za pomocą identyfikatora strefy czasowej Olson (np. "Europe/London" , "GMT" ) lub przesunięcie UTC (np. "+02:30" , "-1030" ).

Identyfikator strefy czasowej Olsona

Oto przykład, który wyświetla tydzień ISO w dwóch różnych strefach czasowych, z których każda używa identyfikatorów stref czasowych Olson:

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

Wynik:

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

W takim przypadku data przesuwa się do następnego tygodnia ISO, gdy używasz Pacific/Auckland strefa czasowa.

Przesunięcie UTC

Oto ten sam przykład, ale tym razem używamy przesunięcia UTC.

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

Wynik:

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

Zwróć tydzień ISO z ObjectId

Możesz użyć $isoWeek aby zwrócić część tygodnia ISO z ObjectId.

Wartości ObjectId to 12-bajtowe wartości szesnastkowe, które składają się z:

  • 4-bajtowa wartość znacznika czasu, reprezentująca utworzenie ObjectId, mierzona w sekundach od epoki Uniksa.
  • 5 bajtów to wartość losowa
  • Licznik przyrostowy o 3 bajty, zainicjowany do wartości losowej.

Podsumowując, nasz dokument wygląda tak:

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

Ten dokument zawiera ObjectId. Dlatego możemy użyć $isoWeek aby zwrócić tydzień ISO, w którym nasz dokument został utworzony (a dokładniej, kiedy _id wartość ObjectId pola została utworzona).

Przykład:

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

Wynik:

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

Widzimy, że dokument powstał w 3 tygodniu roku przy użyciu formatu ISO 8601.

W tym przypadku użyłem również $toDate operator potoku agregacji, aby zwrócić część znacznika czasu ObjectId.

Co to jest tydzień ISO?

System daty tygodnia ISO to system kalendarza, który jest częścią normy daty i godziny ISO 8601 wydanej przez Międzynarodową Organizację Normalizacyjną (ISO). System określa rok tygodnia na szczycie kalendarza gregoriańskiego, definiując notację porządkową tygodni w roku.

Lata numeracji tygodni ISO mają 52 lub 53 pełne tygodnie. Oznacza to, że w roku jest 364 lub 371 dni, zamiast zwykłych 365 lub 366 dni.

Tygodnie ISO zaczynają się od poniedziałku. Rok każdego tygodnia ISO to rok gregoriański, w którym przypada czwartek. Numery tygodni ISO zaczynają się od 1 z tygodniem, który zawiera pierwszy czwartek roku.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Zrozumienie opcji limitu czasu klienta MongoDB

  2. Czy ktoś próbował MongoDB w Google App Engine?

  3. Najlepsze praktyki .NET dotyczące połączeń MongoDB?

  4. Kiedy zamknąć połączenie z bazą danych MongoDB w Nodejs

  5. Uzyskaj dostęp do MongoDB bezpośrednio przez JavaScript