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") }