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.