W MongoDB $toDate
operator agregacji konwertuje wartość na datę
$toDate
przyjmuje dowolne prawidłowe wyrażenie. Jeśli wyrażenia nie można przekonwertować na datę, zwraca błąd. Jeśli wyrażenie ma wartość null
lub brak, zwraca null
.
Przykład
Załóżmy, że mamy kolekcję o nazwie samples
z następującym dokumentem:
{ "_id" : ObjectId("60066f1cc8eb4369cf6ad9c9"), "double" : 1613372035500.75, "decimal" : NumberDecimal("1613372035500.75"), "long" : NumberLong("1613372035500"), "string" : "2021-02-15 06:53:55" }
Możemy użyć następującego zapytania, aby zwrócić każdą z tych wartości jako datę.
db.samples.aggregate(
[
{
$project:
{
_id: 0,
"ObjectId": { $toDate: "$_id" },
"double": { $toDate: "$double" },
"decimal": { $toDate: "$decimal" },
"long": { $toDate: "$long" },
"string": { $toDate: "$string" }
}
}
]
).pretty()
Wynik:
{ "ObjectId" : ISODate("2021-01-19T05:33:16Z"), "double" : ISODate("2021-02-15T06:53:55.500Z"), "decimal" : ISODate("2021-02-15T06:53:55.500Z"), "long" : ISODate("2021-02-15T06:53:55.500Z"), "string" : ISODate("2021-02-15T06:53:55Z") }
Zgodnie z oczekiwaniami, wszystkie pola są zwracane wraz z odpowiadającymi im wartościami przekonwertowanymi na wartości daty.
Możesz zauważyć, że pole ObjectId zwraca inną datę innym. Dzieje się tak, ponieważ _id
wartość pola odzwierciedla datę utworzenia dokumentu, podczas gdy pozostałe daty były po prostu arbitralnymi datami utworzonymi przeze mnie. Więcej o ObjectId poniżej.
Typy danych wejściowych
$toDate
operator akceptuje następujące typy danych wejściowych:
- Podwójny
- Dziesiętny
- Długie
- Ciąg (musi być prawidłowym ciągiem daty)
- Identyfikator obiektu
Więcej na ten temat poniżej.
Typy numeryczne
Używając typów numerycznych (Double, Decimal i Long), $toDate
zwraca datę odpowiadającą liczbie milisekund reprezentowanych przez wartość. W przypadku Double i Decimal jest to wartość obcięta. $toDate
operator interpretuje wartości liczbowe w następujący sposób:
- Wartość dodatnia odpowiada liczbie milisekund od 1 stycznia 1970 r.
- Wartość ujemna odpowiada liczbie milisekund przed 1 stycznia 1970 r.
Typy ciągów
W przypadku używania typu ciągu ciąg musi być prawidłowym ciągiem daty. Na przykład:
"2021-02-15"
"15 February 2021"
"2021-02-15 06:53:55"
"2021-02-15 06:53:55+1100"
Nie możesz używać niepełnych dat ani nieprawidłowych wartości, takich jak "Monday"
, "March"
, "2020"
itp.
Identyfikator obiektu
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.
$toDate
operator zwraca część znacznika czasu jako datę.