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

MongoDB $dateToString

In MongoDB der $dateToString Der Aggregations-Pipeline-Operator konvertiert ein bestimmtes Datumsobjekt in eine Zeichenfolge.

Der $dateToString Der Operator akzeptiert entweder ein Datum, einen Zeitstempel oder eine Objekt-ID.

Sie können ein für das Ergebnis zu verwendendes Format angeben, indem Sie eine Formatspezifikation angeben. Die Formatspezifikation kann ein beliebiges Zeichenfolgenliteral sein, das 0 oder mehr Formatbezeichner enthält.

Die Formatangabe ist ab MongoDB Version 4.0 optional, wenn featureCompatibilityVersion auf 4.0 eingestellt ist oder höher. Frühere Versionen erfordern die Formatangabe.

Sie können optional die timezone verwenden -Parameter, um die zu verwendende Zeitzone anzugeben.

Sie können auch den onNull verwenden Parameter, um anzugeben, was zurückgegeben werden soll, wenn das Datum null ist oder fehlt.

Beispiel

Angenommen, wir haben eine Sammlung namens pets mit folgendem Dokument:

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"name" : "Fetch",
	"born" : ISODate("2020-12-31T23:30:15.123Z")
}

Wir können den folgenden Code ausführen, um eine Datumszeichenfolge von born zurückzugeben Feld in diesem Dokument.

db.pets.aggregate(
   [
     {
       $project: {
         _id: 0,
          dateString: { $dateToString: { format: "%Y-%m-%dT%H:%M:%S.%LZ", date: "$born" } }
       }
     }
   ]
)

Ergebnis:

{ "dateString" : "2020-12-31T23:30:15.123Z" }

Dieses Beispiel verwendet %Y-%m-%dT%H:%M:%S.%LZ als Formatangabe. Dies ist zufällig die Standardformatspezifikation, aber in diesem Fall haben wir sie explizit angegeben. Wir können sehen, dass die Datumszeichenfolge im angegebenen Format zurückgegeben wird.

Hier habe ich dateString verwendet als zurückzugebender Feldname, aber das hätte alles sein können (wie formattedDate , theDate etc).

Die _id Das Feld wird standardmäßig zurückgegeben, wenn Projektionen in MongoDB verwendet werden, aber in diesem Beispiel habe ich die _id explizit ausgeblendet Feld mit _id: 0 .

Siehe MongoDB $dateToString Formatbezeichner für eine Liste der verfügbaren Formatbezeichner.

Standardausgabe

Wie bereits erwähnt, ist die Formatspezifikation im vorherigen Beispiel die Standardformatspezifikation.

Wenn Sie MongoDB Version 4.0 oder höher verwenden, mit featureCompatibilityVersion auf 4.0 setzen oder höher (siehe So zeigen Sie Ihre aktuelle featureCompatibilityVersion an und wie man es einstellt), können Sie die Formatangabe weglassen, wenn Sie möchten, dass das Datum mit dem obigen Format formatiert wird.

Daher könnten wir den vorherigen umschreiben. Beispiel dazu:

db.pets.aggregate(
   [
     {
       $project: {
         _id: 0,
          dateString: { $dateToString: { date: "$born" } }
       }
     }
   ]
)

Ergebnis:

{ "dateString" : "2020-12-31T23:30:15.123Z" }

Geben Sie eine Zeitzone an

Sie können eine Zeitzone angeben, die für die Ausgabe von $dateToString verwendet werden soll Betreiber.

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 die Datumszeichenfolge in drei verschiedenen Zeitzonen ausgibt, die jeweils die Olson-Zeitzonen-IDs verwenden:

db.pets.aggregate(
   [
     {
       $project: {
         _id: 0,
          UTC: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "UTC" } },
          Honolulu: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "Pacific/Honolulu" } },
          Auckland: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "Pacific/Auckland" } }
       }
     }
   ]
).pretty()

Ergebnis:

{
	"UTC" : "2020-12-31T23:30",
	"Honolulu" : "2020-12-31T13:30",
	"Auckland" : "2021-01-01T12:30"
}

UTC-Offset

Hier ist ein Beispiel, das den UTC-Offset verwendet.

db.pets.aggregate(
   [
     {
       $project: {
         _id: 0,
          UTC: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "+00:00" } },
          Honolulu: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "-10:00" } },
          Auckland: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "+12:00" } }
       }
     }
   ]
).pretty()

Ergebnis:

{
	"UTC" : "2020-12-31T23:30",
	"Honolulu" : "2020-12-31T13:30",
	"Auckland" : "2021-01-01T11:30"
}

ISO-Wochendatumsformat

Es gibt einige Formatbezeichner, mit denen Sie die Datumszeichenfolge im ISO 8601-Format ausgeben können.

Insbesondere können Sie verwenden:

Formatbezeichner Ausgabe
%G Jahr im ISO 8601-Format
%u Zahl des Wochentags im Format ISO 8601 (1-Montag, 7-Sonntag)
%V Woche des Jahres im ISO 8601-Format

Angenommen, wir haben eine Sammlung namens cats mit folgendem Dokument:

{
	"_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"),
	"name" : "Scratch",
	"born" : ISODate("2021-01-03T23:30:15.123Z")
}

Wir können den folgenden Code ausführen, um die ISO-Datumsfelder aus born zu extrahieren Feld in diesem Dokument.

Hier ist ein Beispiel zur Veranschaulichung:

db.cats.aggregate(
   [
     {
       $project: {
         _id: 0,
          isoYear: { $dateToString: { format: "%G", date: "$born" } },
          isoDayOfWeek: { $dateToString: { format: "%u", date: "$born" } },
          isoWeekOfYear: { $dateToString: { format: "%V", date: "$born" } }
       }
     }
   ]
)

Ergebnis:

{ "isoYear" : "2020", "isoDayOfWeek" : "7", "isoWeekOfYear" : "53" }

Im Gegensatz dazu ist unten das gleiche Beispiel, aber unter Verwendung der Nicht-ISO-Wochendatumsteile.

db.cats.aggregate(
   [
     {
       $project: {
         _id: 0,
          year: { $dateToString: { format: "%Y", date: "$born" } },
          dayofweek: { $dateToString: { format: "%w", date: "$born" } },
          weekofyear: { $dateToString: { format: "%U", date: "$born" } }
       }
     }
   ]
)

Ergebnis:

{ "year" : "2021", "dayofweek" : "1", "weekofyear" : "01" }

Wir können sehen, dass das Ergebnis völlig anders ist.

Der onNull Parameter

Der onNull -Parameter kann verwendet werden, um anzugeben, was zurückgegeben werden soll, wenn das Datum null ist oder nicht existiert.

Der für onNull bereitgestellte Wert Parameter kann ein beliebiger gültiger Ausdruck sein.

Hier ist ein Beispiel:

db.pets.aggregate(
   [
     {
       $project: {
          _id: 0,
          dateString: { $dateToString: { date: null, onNull: "No date supplied" } }
       }
     }
   ]
)

Ergebnis:

{ "dateString" : "No date supplied" }

In diesem Fall war das Datum null und so enthält das Ausgabedokument die Zeichenfolge, die ich für onNull bereitgestellt habe Parameter.

Gib die Datumsteile von einer ObjectId zurück

Sie können $dateToString verwenden um eine Datumszeichenfolge von einer ObjectId zurückzugeben.

ObjectId-Werte sind 12-Byte-Hexadezimalwerte, die aus Folgendem bestehen:

  • Ein 4-Byte-Zeitstempelwert, der die Erstellung der ObjectId darstellt, gemessen in Sekunden seit der Unix-Epoche.
  • Ein 5 Byte ist ein Zufallswert
  • Ein 3-Byte-Zähler, der auf einen zufälligen Wert initialisiert wird.

Um es noch einmal zusammenzufassen, unser erstes Dokument sieht so aus:

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"name" : "Fetch",
	"born" : ISODate("2020-12-31T23:30:15.123Z")
}

Dieses Dokument enthält eine ObjectId. Wir können daher $dateToString verwenden um eine Datumszeichenfolge zurückzugeben, basierend auf dem Datum, an dem unser Dokument erstellt wurde (oder genauer gesagt, wann die _id der ObjectId-Wert des Felds wurde erstellt).

Beispiel:

db.pets.aggregate(
   [
     {
       $project: {
          timestamp: { $toDate: "$_id" },
          dateString: { $dateToString: { format: "%d-%m-%Y", date: "$_id" } }
       }
     }
   ]
).pretty()

Ergebnis:

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"timestamp" : ISODate("2021-01-19T01:11:35Z"),
	"dateString" : "19-01-2021"
}

In diesem Fall habe ich mich entschieden, nur den Datumsteil (nicht den Zeitteil) zurückzugeben. Ich habe auch die Reihenfolge der Tage, Monate und Jahre geändert, um zu zeigen, dass Sie dies bei Bedarf durchaus tun können.

Ich habe auch den $toDate verwendet Aggregations-Pipeline-Operator, um den Zeitstempelteil der ObjectId zurückzugeben.