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.