MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB $dateFromParts

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