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

MongoDB $dateToString

W MongoDB $dateToString Operator potoku agregacji konwertuje dany obiekt daty na ciąg.

$dateToString operator akceptuje Date, Timestamp lub ObjectId.

Możesz określić format, który ma być używany dla wyniku, podając specyfikację formatu. Specyfikacja formatu może być dowolnym literałem ciągu, zawierającym 0 lub więcej specyfikatorów formatu.

Specyfikacja formatu jest opcjonalna od MongoDB w wersji 4.0, gdy featureCompatibilityVersion jest ustawiony na 4.0 lub wyżej. Wcześniejsze wersje wymagają specyfikacji formatu.

Opcjonalnie możesz użyć timezone parametr, aby określić strefę czasową do użycia.

Możesz także użyć onNull parametr określający co zwrócić, jeśli data jest null lub brak.

Przykład

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

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"name" : "Fetch",
	"born" : ISODate("2020-12-31T23:30:15.123Z")
}

Możemy uruchomić następujący kod, aby zwrócić ciąg daty z born pole w tym dokumencie.

db.pets.aggregate(
   [
     {
       $project: {
         _id: 0,
          dateString: { $dateToString: { format: "%Y-%m-%dT%H:%M:%S.%LZ", date: "$born" } }
       }
     }
   ]
)

Wynik:

{ "dateString" : "2020-12-31T23:30:15.123Z" }

W tym przykładzie użyto %Y-%m-%dT%H:%M:%S.%LZ jako specyfikacja formatu. Tak się składa, że ​​jest to domyślna specyfikacja formatu, ale w tym przypadku wyraźnie ją określiliśmy. Widzimy, że ciąg daty jest zwracany w określonym formacie.

Tutaj użyłem dateString jako nazwę pola do zwrócenia, ale może to być cokolwiek (na przykład formattedDate , theDate 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 .

Zobacz MongoDB $dateToString Specyfikatory formatu dla listy dostępnych specyfikatorów formatu.

Domyślne wyjście

Jak wspomniano, specyfikacja formatu w poprzednim przykładzie jest domyślną specyfikacją formatu.

Jeśli używasz MongoDB w wersji 4.0 lub nowszej, z featureCompatibilityVersion ustaw na 4.0 lub wyższy (zobacz, jak wyświetlić swoją aktualną featureCompatibilityVersion i jak to ustawić), możesz pominąć specyfikację formatu, jeśli chcesz, aby data była sformatowana przy użyciu powyższego formatu.

Dlatego mogliśmy przepisać poprzedni. przykład do tego:

db.pets.aggregate(
   [
     {
       $project: {
         _id: 0,
          dateString: { $dateToString: { date: "$born" } }
       }
     }
   ]
)

Wynik:

{ "dateString" : "2020-12-31T23:30:15.123Z" }

Określ strefę czasową

Możesz określić strefę czasową, która ma być używana dla danych wyjściowych $dateToString operatora.

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 ciąg daty w trzech różnych strefach czasowych, z których każda używa identyfikatorów strefy czasowej Olson:

db.pets.aggregate(
   [
     {
       $project: {
         _id: 0,
          UTC: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "UTC" } },
          Honolulu: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "Pacific/Honolulu" } },
          Auckland: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "Pacific/Auckland" } }
       }
     }
   ]
).pretty()

Wynik:

{
	"UTC" : "2020-12-31T23:30",
	"Honolulu" : "2020-12-31T13:30",
	"Auckland" : "2021-01-01T12:30"
}

Przesunięcie UTC

Oto przykład, który używa przesunięcia UTC.

db.pets.aggregate(
   [
     {
       $project: {
         _id: 0,
          UTC: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "+00:00" } },
          Honolulu: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "-10:00" } },
          Auckland: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "+12:00" } }
       }
     }
   ]
).pretty()

Wynik:

{
	"UTC" : "2020-12-31T23:30",
	"Honolulu" : "2020-12-31T13:30",
	"Auckland" : "2021-01-01T11:30"
}

Format daty tygodnia ISO

Istnieje kilka specyfikatorów formatu, które umożliwiają wyprowadzanie ciągu daty przy użyciu formatu ISO 8601.

W szczególności możesz użyć:

Specyfikator formatu Wyjście
%G Rok w formacie ISO 8601
%u Numer dnia tygodnia w formacie ISO 8601 (1-poniedziałek, 7-niedziela)
%V Tydzień roku w formacie ISO 8601

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ć pola daty ISO z born pole w tym dokumencie.

Oto przykład do zademonstrowania:

db.cats.aggregate(
   [
     {
       $project: {
         _id: 0,
          isoYear: { $dateToString: { format: "%G", date: "$born" } },
          isoDayOfWeek: { $dateToString: { format: "%u", date: "$born" } },
          isoWeekOfYear: { $dateToString: { format: "%V", date: "$born" } }
       }
     }
   ]
)

Wynik:

{ "isoYear" : "2020", "isoDayOfWeek" : "7", "isoWeekOfYear" : "53" }

W przeciwieństwie do tego, poniżej znajduje się ten sam przykład, ale z użyciem części daty tygodnia innej niż ISO.

db.cats.aggregate(
   [
     {
       $project: {
         _id: 0,
          year: { $dateToString: { format: "%Y", date: "$born" } },
          dayofweek: { $dateToString: { format: "%w", date: "$born" } },
          weekofyear: { $dateToString: { format: "%U", date: "$born" } }
       }
     }
   ]
)

Wynik:

{ "year" : "2021", "dayofweek" : "1", "weekofyear" : "01" }

Widzimy, że wynik jest zupełnie inny.

onNull Parametr

onNull Parametr może służyć do określenia, co zwrócić, jeśli data jest null lub nie istnieje.

Wartość dostarczona do onNull parametr może być dowolnym poprawnym wyrażeniem.

Oto przykład:

db.pets.aggregate(
   [
     {
       $project: {
          _id: 0,
          dateString: { $dateToString: { date: null, onNull: "No date supplied" } }
       }
     }
   ]
)

Wynik:

{ "dateString" : "No date supplied" }

W tym przypadku data była null więc dokument wyjściowy zawiera ciąg, który podałem dla onNull parametr.

Zwróć części daty z ObjectId

Możesz użyć $dateToString aby zwrócić ciąg daty 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 pierwszy dokument wygląda tak:

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"name" : "Fetch",
	"born" : ISODate("2020-12-31T23:30:15.123Z")
}

Ten dokument zawiera ObjectId. Dlatego możemy użyć $dateToString aby zwrócić ciąg daty na podstawie daty utworzenia naszego dokumentu (a dokładniej, kiedy _id wartość ObjectId pola została utworzona).

Przykład:

db.pets.aggregate(
   [
     {
       $project: {
          timestamp: { $toDate: "$_id" },
          dateString: { $dateToString: { format: "%d-%m-%Y", date: "$_id" } }
       }
     }
   ]
).pretty()

Wynik:

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"timestamp" : ISODate("2021-01-19T01:11:35Z"),
	"dateString" : "19-01-2021"
}

W tym przypadku zdecydowałem się zwrócić tylko część daty (nie część czasu). Zmieniłem również kolejność dni, miesięcy i roku, aby pokazać, że w razie potrzeby możesz to zrobić.

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


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB $round

  2. restart usługi sudo mongodb daje nierozpoznany błąd usługi w ubuntu 14.0.4

  3. Konfiguracja środowiska MongoDB | Zainstaluj MongoDB w systemie Windows

  4. Dlaczego nadal powinieneś używać silnika pamięci masowej MMAPv1 dla MongoDB

  5. Co się dzieje z Meteor i Fibers/bindEnvironment()?