W MongoDB $dateFromParts
Operator potoku agregacji konstruuje i zwraca obiekt Date z części składowych daty.
Każdą część daty podajesz jako osobne pole.
W razie potrzeby można określić pola daty składowej w formacie daty tygodnia ISO.
Przykład
Załóżmy, że mamy kolekcję o nazwie dateParts
z następującym dokumentem:
{ "_id" : 1, "year" : 2020, "month" : 12, "day" : 31, "hour" : 23, "minute" : 30, "second" : 25, "millisecond" : 123 }
Dokument zawiera inne pole dla każdej części daty.
Możemy uruchomić następujący kod, aby zwrócić obiekt daty z pól w tych dokumentach.
db.dateParts.aggregate([
{
$project: {
date: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond"
}
}
}
}])
Wynik:
{ "_id" : 1, "date" : ISODate("2020-12-31T23:30:25.123Z") }
Wszystkie części daty/czasu zostały przekonwertowane na pojedynczy obiekt daty.
Strefy czasowe
Możesz użyć timezone
pole, aby określić strefę czasową.
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 używa identyfikatorów stref czasowych Olson do wyprowadzania trzech różnych dat z jednego dokumentu, w oparciu o trzy różne strefy czasowe.
db.dateParts.aggregate([
{
$project: {
dateUTC: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "Pacific/Auckland"
}
},
dateHonolulu: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "Pacific/Honolulu"
}
},
dateAuckland: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "Pacific/Auckland"
}
}
}
}]).pretty()
Wynik:
{ "_id" : 1, "dateUTC" : ISODate("2020-12-31T10:30:25.123Z"), "dateHonolulu" : ISODate("2021-01-01T09:30:25.123Z"), "dateAuckland" : ISODate("2020-12-31T10:30:25.123Z") }
Przesunięcie UTC
Oto przykład, który używa przesunięcia UTC.
db.dateParts.aggregate([
{
$project: {
"date+00:00": {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "+00:00"
}
},
"date-10:00": {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "-10:00"
}
},
"date+12:00": {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "+12:00"
}
}
}
}]).pretty()
Wynik:
{ "_id" : 1, "date+00:00" : ISODate("2020-12-31T23:30:25.123Z"), "date-10:00" : ISODate("2021-01-01T09:30:25.123Z"), "date+12:00" : ISODate("2020-12-31T11:30:25.123Z") }
Format daty tygodnia ISO
W razie potrzeby części daty można określić przy użyciu formatu ISO 8601.
W szczególności możesz użyć:
Specyfikator formatu | Wyjście |
---|---|
isoWeekYear | Rok w formacie ISO 8601. To pole jest wymagane, jeśli nie używasz year (i year jest wymagane, jeśli nie używasz isoWeekYear ). |
isoWeek | Tydzień roku w formacie ISO 8601. Można używać tylko z isoWeekYear . |
isoDayOfWeek | Dzień tygodnia (1-poniedziałek, 7-niedziela). Można używać tylko z isoWeekYear . |
Załóżmy, że wstawiamy drugi dokument, który wygląda tak:
{ "_id" : 2, "isoWeekYear" : 2021, "isoWeek" : 32, "isoDayOfWeek" : 7, "hour" : 23, "minute" : 30, "second" : 25, "millisecond" : 123, "timezone" : "UTC" }
Widzimy, że używa isoWeekYear
, isoWeek
i isoDayOfWeek
zamiast year
, month
i day
(którego używa pierwszy dokument).
Możemy użyć następującego kodu do skonstruowania obiektu Date z tego dokumentu:
db.dateParts.aggregate([
{ $match: { _id: 2} },
{
$project: {
date: {
$dateFromParts: {
"isoWeekYear": "$isoWeekYear",
"isoWeek": "$isoWeek",
"isoDayOfWeek": "$isoDayOfWeek",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond",
"timezone": "$timezone"
}
}
}
}
])
Wynik:
{ "_id" : 2, "date" : ISODate("2021-08-15T23:30:25.123Z") }
Pola poza zakresem
Począwszy od MongoDB 4.4, obsługiwany zakres wartości dla year
i isoWeekYear
to 1-9999
. We wcześniejszych wersjach dolna granica dla tych wartości wynosiła 0
a obsługiwany zakres wartości to 0-9999
.
Począwszy od MongoDB 4.0, jeśli wartość określona dla pól innych niż year
, isoWeekYear
i timezone
jest poza prawidłowym zakresem, $dateFromParts
operator przenosi lub odejmuje różnicę od innych części daty, aby obliczyć datę.
Wartości wyższe niż zakres
Załóżmy, że do naszej kolekcji dodamy następujący dokument:
{ "_id" : 3, "year" : 2020, "month" : 14, "day" : 65, "hour" : 48, "minute" : 130, "second" : 625, "millisecond" : 123 }
Wiele pól daty i godziny w tym dokumencie jest wyższych niż ich odpowiednie prawidłowe zakresy.
Uruchommy następujące polecenie, aby przekonwertować go na obiekt Date:
db.dateParts.aggregate([
{ $match: { _id: 3} },
{
$project: {
date: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond"
}
}
}
}
])
Wynik:
{ "_id" : 3, "date" : ISODate("2021-04-08T02:20:25.123Z") }
Widzimy, że części daty w wynikowym obiekcie Date różnią się od odpowiednich części daty w dokumencie. Dzieje się tak, ponieważ $dateFromParts
ponownie obliczył datę, aby uwzględnić wartości części daty, które przekroczyły ich normalny zakres.
Wartości niższe niż zakres
Załóżmy, że do naszej kolekcji dodamy następujący dokument:
{ "_id" : 4, "year" : 2020, "month" : 0, "day" : 0, "hour" : 0, "minute" : 0, "second" : 0, "millisecond" : 0 }
Wiele pól daty i godziny w tym dokumencie jest niższych niż ich odpowiednie prawidłowe zakresy.
Uruchommy następujące polecenie, aby przekonwertować go na obiekt Date:
db.dateParts.aggregate([
{ $match: { _id: 4} },
{
$project: {
date: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond"
}
}
}
}
])
Wynik:
{ "_id" : 4, "date" : ISODate("2019-11-30T00:00:00Z") }