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ń