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

8 sposobów na uzyskanie dnia z randki w MongoDB

Podczas wyodrębniania dnia z daty dokładna opcja, której użyjemy, będzie zależeć od tego, jak chcemy, aby dzień był reprezentowany.

Na przykład, czy chcemy dzień tygodnia, dzień miesiąca czy dzień roku? A może chcemy go w formacie ISO 8601? Wartość zwrotu będzie zwykle różna w zależności od tego, którą wybierzemy.

W tym artykule omówiono te opcje i dlatego przedstawiamy 8 sposobów na zwrócenie części dziennej z daty w MongoDB.

Przykładowe dane

Załóżmy, że mamy kolekcję o nazwie koty z następującymi dokumentami:

{ "_id" :1, "name" :"Scratch", "born" :ISODate("2021-01-03T23:30:15.123Z") }{ "_id" :2, "name" :" Miau", "urodzony" :ISODate("2019-12-08T04:00:12Z") }{ "_id" :3, "imię" :"Puszysty", "urodzony" :ISODate("2020-09-24T10:30:00Z") }

Poniższe przykłady pokazują różne opcje zwracania części dnia z born pola tych dokumentów.

$dayOfWeek Operator

Jak sama nazwa wskazuje, $dayOfWeek operator zwraca dzień tygodnia od daty.

Możemy uruchomić następujący kod, aby zwrócić dzień tygodnia z born w powyższym dokumencie.

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

Wynik:

{ "DzieńTygodniaNarodzin" :1 }{ "DzieńTygodniaNarodzin" :1 }{ "DzieńTygodniaNarodzin" :5 }

Możliwe jest również określenie strefy czasowej podczas korzystania z $dayOfWeek operator.

Zobacz MongoDB $dayOfWeek aby uzyskać więcej informacji i przykładów.

$dayOfMonth Operator

$dayOfMonth operator zwraca dzień miesiąca od daty.

Przykład:

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

Wynik:

{ "DzieńUrodzeniaMiesiąca" :3 }{ "DzieńUrodzeniaMiesiąca" :8 }{ "DzieńUrodzeniaMiesiąca" :24 }

Możesz również określić strefę czasową podczas korzystania z $dayOfMonth operator.

Zobacz MongoDB $dayOfMonth aby uzyskać więcej informacji i przykładów.

$dayOfYear Operator

Tak, zgadłeś. $dayOfYear operator zwraca dzień roku od daty.

Przykład:

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

Wynik:

{ "DzieńUrodzeniaRok" :3 }{ "DzieńUrodzeniaRok" :342 }{ "DzieńUrodzeniaRok" :268 }

$dayOfYear operator akceptuje również parametr strefy czasowej.

Zobacz MongoDB $dayOfYear aby uzyskać więcej informacji i przykładów.

$dateToString Operator

$dateToString operator konwertuje obiekt daty na ciąg znaków zgodnie z formatem określonym przez użytkownika. Użytkownik może zatem określić, że w razie potrzeby zwracana jest tylko część dnia.

Istnieją specyfikatory formatu dla każdej części daty, a jeśli chodzi o część dnia, masz do wyboru specyfikatory formatu, które będą zależeć od tego, czy chcesz zwrócić dzień tygodnia, dzień miesiąca, dzień roku, czy dzień tygodnia w formacie ISO 8601.

Przykład:

db.cats.aggregate( [ { $project:{ _id:0, birthDayOfWeek:{ $dateToString:{ format:"%w", date:"$born" } }, birthDayOfMonth:{ $dateToString :{ format:"%d", date:"$born" } }, birthDayOfYear:{ $dateToString:{ format:"%j", date:"$born" } }, birthDayOfWeekISO:{ $dateToString:{ format:"%u", data:"$born" } } } } ]).pretty() 

Wynik:

{ "birthDayOfWeek" :"1", "birthDayOfMonth" :"03", "birthDayOfYear" :"003", "birthDayOfWeekISO" :"7"}{ "urthDayOfWeek" :"1", "urthDayOfMiesiąc" 08", "DzieńUrodzin" :"342", "DzieńTygodnia" :"7"}{ "DzieńTygodnia" :"5", "DzieńUrodzenia" :"24", "DzieńUrodzenia" :"ISO268", "DzieńUrodzenia" :"tydzień" "}

Mogliśmy dostarczyć więcej specyfikatorów formatu, aby uwzględnić w wyniku inne części dat, ale ponieważ w tym artykule interesuje nas tylko wyodrębnienie dnia, użyliśmy tylko specyfikatorów formatu do zwrócenia porcji dnia.

Zobacz MongoDB $dateToString aby uzyskać więcej informacji i przykładów.

Zobacz także MongoDB $dateToString Specyfikatory formatu dla listy specyfikatorów formatu, których można używać z $dateToString .

$dateToParts Operator

$dateToParts Operator zwraca dokument, który zawiera części składowe danej wartości daty BSON jako indywidualne właściwości. Zwracane właściwości to rok , miesiąc , dzień , godzina , minuta , druga i milisekundę .

Dlatego możemy użyć $dateToParts w jednym etapie potoku, a następnie dodaj kolejny etap potoku, który wyodrębnia dzień część, jeśli jest wymagana.

Oto, co $dateToParts zwraca po nasze trzy dokumenty:

db.cats.aggregate( [ { $project:{ _id:0, dateParts:{ $dateToParts:{ date:"$born" } } } } ]).pretty() 

Wynik:

{ "dateParts" :{ "rok" :2021, "miesiąc" :1, "dzień" :3, "godzina" :23, "minuta" :30, "sekunda" :15, "milisekunda" :123 }}{ "dataCzęści" :{ "rok" :2019, "miesiąc" :12, "dzień" :8, "godzina" :4, "minuta" :0, "sekunda" :12, "milisekunda" :0 } }{ "dataCzęści" :{ "rok" :2020, "miesiąc" :9, "dzień" :24, "godzina" :10, "minuta" :30, "sekunda" :0, "milisekunda" :0 }} 

Te dane można przekazać do następnego etapu potoku, aby wyodrębnić tylko dzień pole.

Oto, co się stanie, jeśli dodamy kolejną projekcję tylko na dzień pole:

db.cats.aggregate( [ { $project:{ _id:0, dateParts:{ $dateToParts:{ date:"$born" } } } }, { $project:{ birthDay:"$dateParts .dzień" } } ]) 

Wynik:

{ "urodziny" :3 }{ "urodziny" :8 }{ "urodziny" :24 }

Oczywiście nie jest to tak zwięzłe, jak korzystanie z poprzednich opcji. Jednak w zależności od tego, co robisz w swoim potoku, takie podejście może być opcją.

Warto również wspomnieć, że $dateToParts akceptuje iso8601 parametr, który modyfikuje dokument wyjściowy tak, aby używał pól daty tygodnia ISO.

Zobacz MongoDB $dateToParts aby uzyskać więcej informacji i przykładów.

forEach() Metoda

Możesz użyć cursor.forEach() aby przejść przez kursor, używając metody JavaScript, aby zwrócić tylko wartość dnia.

db.cats.find().forEach( function(c) { print( c.born.getDay() ); }); 

Wynik:

104

W tym przypadku używamy JavaScript getDay() metoda, która zwraca liczbę całkowitą z zakresu od 0 do 6, odpowiadającą dniowi tygodnia dla podanej daty, zgodnie z czasem lokalnym.

Inną opcją jest użycie getUTCDay() metoda, która wykorzystuje czas uniwersalny. Użyjemy tej metody w następnym przykładzie.

Alternatywnie moglibyśmy użyć JavaScript getDate() metoda, która zwraca liczbę całkowitą z przedziału od 1 do 31, reprezentującą dzień miesiąca dla podanej daty.

Ponadto ta opcja zwraca tylko rzeczywistą wartość dnia, a nie cały dokument, jak w poprzednich przykładach.

map() Metoda

cursor.map() Metoda stosuje funkcję do każdego dokumentu odwiedzanego przez kursor i łączy wartości w tablicę.

Przykład:

db.cats.find().map( function(c) { c =c.born.getUTCDay(); return c; }); 

Wynik:

[ 0, 0, 4 ]

Jak wspomniano, JavaScript getUTCDay() metoda zwraca swój wynik przy użyciu czasu uniwersalnego. W tym przypadku spowodowało to zwrócenie innej wartości dla pierwszego dokumentu (otrzymaliśmy 0 w tym przykładzie w porównaniu z 1 w poprzednim).

$isoDayOfWeek Operator

Jeśli chcesz zwrócić dzień tygodnia w formacie ISO 8601, możesz użyć $isoDayOfWeek . Rok ISO 8601 rozpoczyna się w poniedziałek pierwszego tygodnia i kończy w niedzielę ostatniego tygodnia.

Przykład:

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

Wynik:

{ "narodzinyDzieńTygodnia" :7 }{ "narodzinyDzieńTygodnia" :7 }{ "narodzinyDzieńTygodnia" :4 }

W tym przypadku otrzymujemy zupełnie inny wynik niż przy użyciu $dayOfWeek operatora, ze względu na sposób, w jaki ISO 8601 oblicza daty.

Oto przykład, który pokazuje tę różnicę:

db.cats.aggregate( [ { $project:{ _id:0, birthDayOfWeek:{ $dayOfWeek:"$born" }, birthIsoDayOfWeek:{ $isoDayOfWeek:"$born" } } } ]) 

Wynik:

{ "DzieńTygodniaNarodzin" :1, "DzieńTygodniaNarodzin" :7 }{ "DzieńTygodniaNarodzin" :1, "DzieńTygodniaNarodzin" :7 }{ "DzieńTygodniaNarodzin" :5, "DzieńNarodzin}" 4tydzień 
  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Czy są jakieś powody, dla których powinienem/nie powinienem używać ObjectId w moim adresie URL RESTful

  2. Repozytorium Spring Data Mongo::Wspólna metoda we wszystkich wydaniach Repo

  3. Wkładka Mongodb/mongoose nie jest funkcją

  4. Szyfrowanie bazy danych MongoDB

  5. Wpychaj przedmioty do tablicy mongo za pomocą mongoose