In MongoDB die $dateFromParts
Der Aggregations-Pipeline-Operator erstellt ein Date-Objekt aus den Bestandteilen des Datums und gibt es zurück.
Sie geben jeden Datumsteil als separates Feld an.
Sie können Ihre konstituierenden Datumsfelder bei Bedarf im ISO-Wochendatumsformat angeben.
Beispiel
Angenommen, wir haben eine Sammlung namens dateParts
mit folgendem Dokument:
{ "_id" : 1, "year" : 2020, "month" : 12, "day" : 31, "hour" : 23, "minute" : 30, "second" : 25, "millisecond" : 123 }
Das Dokument enthält für jeden Datumsteil ein anderes Feld.
Wir können den folgenden Code ausführen, um ein Datumsobjekt aus den Feldern in diesen Dokumenten zurückzugeben.
db.dateParts.aggregate([
{
$project: {
date: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond"
}
}
}
}])
Ergebnis:
{ "_id" : 1, "date" : ISODate("2020-12-31T23:30:25.123Z") }
Alle Datums-/Uhrzeitteile wurden in ein einzelnes Datumsobjekt umgewandelt.
Zeitzonen
Sie können die timezone
verwenden Feld, um eine Zeitzone anzugeben.
Die Zeitzone kann entweder mit der Olson-Zeitzonenkennung (z. B. "Europe/London"
, "GMT"
) oder den UTC-Offset (z. B. "+02:30"
). , "-1030"
).
Olson-Zeitzonenkennung
Hier ist ein Beispiel, das Olson-Zeitzonen-IDs verwendet, um drei verschiedene Daten aus einem einzelnen Dokument basierend auf drei verschiedenen Zeitzonen auszugeben.
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()
Ergebnis:
{ "_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") }
UTC-Offset
Hier ist ein Beispiel, das den UTC-Offset verwendet.
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()
Ergebnis:
{ "_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") }
ISO-Wochendatumsformat
Die Datumsteile können bei Bedarf im ISO 8601-Format angegeben werden.
Insbesondere können Sie verwenden:
Formatbezeichner | Ausgabe |
---|---|
isoWeekYear | Jahr im Format ISO 8601. Dieses Feld ist erforderlich, wenn year nicht verwendet wird (und year ist erforderlich, wenn isoWeekYear nicht verwendet wird ). |
isoWeek | Woche des Jahres im Format ISO 8601. Kann nur mit isoWeekYear verwendet werden . |
isoDayOfWeek | Wochentag (1-Montag, 7-Sonntag). Kann nur mit isoWeekYear verwendet werden . |
Angenommen, wir fügen ein zweites Dokument ein, das so aussieht:
{ "_id" : 2, "isoWeekYear" : 2021, "isoWeek" : 32, "isoDayOfWeek" : 7, "hour" : 23, "minute" : 30, "second" : 25, "millisecond" : 123, "timezone" : "UTC" }
Wir können sehen, dass es isoWeekYear
verwendet , isoWeek
und isoDayOfWeek
statt year
, month
und day
(was das erste Dokument verwendet).
Wir können den folgenden Code verwenden, um ein Date-Objekt aus diesem Dokument zu erstellen:
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"
}
}
}
}
])
Ergebnis:
{ "_id" : 2, "date" : ISODate("2021-08-15T23:30:25.123Z") }
Felder außerhalb des Bereichs
Ab MongoDB 4.4 der unterstützte Wertebereich für year
und isoWeekYear
ist 1-9999
. In früheren Versionen war die Untergrenze für diese Werte 0
und der unterstützte Wertebereich war 0-9999
.
Ab MongoDB 4.0, wenn der Wert für andere Felder als year
angegeben ist , isoWeekYear
und timezone
außerhalb des gültigen Bereichs liegt, $dateFromParts
Operator trägt oder subtrahiert die Differenz von anderen Datumsteilen, um das Datum zu berechnen.
Werte über dem Bereich
Angenommen, wir fügen unserer Sammlung das folgende Dokument hinzu:
{ "_id" : 3, "year" : 2020, "month" : 14, "day" : 65, "hour" : 48, "minute" : 130, "second" : 625, "millisecond" : 123 }
Viele der Datums- und Zeitfelder in diesem Dokument liegen über ihren jeweiligen gültigen Bereichen.
Lassen Sie uns den folgenden Befehl ausführen, um es in ein Date-Objekt zu konvertieren:
db.dateParts.aggregate([
{ $match: { _id: 3} },
{
$project: {
date: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond"
}
}
}
}
])
Ergebnis:
{ "_id" : 3, "date" : ISODate("2021-04-08T02:20:25.123Z") }
Wir können sehen, dass sich die Datumsteile im resultierenden Date-Objekt von ihren jeweiligen Datumsteilen im Dokument unterscheiden. Das liegt daran, dass $dateFromParts
das Datum neu berechnet, um die Datumsteilwerte zu berücksichtigen, die ihren normalen Bereich überschritten haben.
Werte kleiner als der Bereich
Angenommen, wir fügen unserer Sammlung das folgende Dokument hinzu:
{ "_id" : 4, "year" : 2020, "month" : 0, "day" : 0, "hour" : 0, "minute" : 0, "second" : 0, "millisecond" : 0 }
Viele der Datums- und Zeitfelder in diesem Dokument liegen unterhalb ihrer jeweiligen gültigen Bereiche.
Lassen Sie uns den folgenden Befehl ausführen, um es in ein Date-Objekt zu konvertieren:
db.dateParts.aggregate([
{ $match: { _id: 4} },
{
$project: {
date: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond"
}
}
}
}
])
Ergebnis:
{ "_id" : 4, "date" : ISODate("2019-11-30T00:00:00Z") }