In MongoDB der $dateFromString
Der Aggregations-Pipeline-Operator konvertiert eine Datums-/Uhrzeitzeichenfolge in ein Datumsobjekt.
Beispiel
Angenommen, wir haben eine Sammlung namens foo
mit folgenden Dokumenten:
{ "_id" : 1, "bar" : "2020-12-31T23:30:25.123" } { "_id" : 2, "bar" : "2020-12-31" } { "_id" : 3, "bar" : "2020-12-31T23:30" }
Alle Dokumente enthalten eine Datums-/Zeitzeichenfolge.
Wir können den folgenden Code ausführen, um ein Datumsobjekt aus der bar
zurückzugeben Felder in diesen Dokumenten.
db.foo.aggregate([
{
$project: {
date: {
$dateFromString: {
dateString: '$bar'
}
}
}
}
])
Ergebnis:
{ "_id" : 1, "date" : ISODate("2020-12-31T23:30:25.123Z") } { "_id" : 2, "date" : ISODate("2020-12-31T00:00:00Z") } { "_id" : 3, "date" : ISODate("2020-12-31T23:30:00Z") }
Alle Datums-/Uhrzeit-Strings wurden in ein Datumsobjekt umgewandelt.
Ich habe auch den Feldnamen von bar
geändert bis date
.
Geben Sie ein Format an
Sie können ein optionales format
angeben -Argument, um das Format der bereitgestellten Datums-/Uhrzeitzeichenfolge anzugeben. Die Formatspezifikation kann ein beliebiges Zeichenfolgenliteral sein, das 0 oder mehr Formatbezeichner enthält.
Das format
-Parameter ist ab MongoDB-Version 4.0 verfügbar.
Das Standardformat ist %Y-%m-%dT%H:%M:%S.%LZ
, was im vorherigen Beispiel verwendet wird.
Angenommen, wir fügen das folgende Dokument in unsere Sammlung ein:
{ "_id" : 4, "bar" : "07/08/2020" }
In diesem Fall könnte das Datum der 7. Tag des 8. Monats oder der 8. Tag des 7. Monats sein, je nach verwendetem Gebietsschema.
Wir können eine Formatspezifikation verwenden, um genau anzugeben, welches es sein soll.
Beispiel:
db.foo.aggregate([
{ $match: { _id: 4 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
format: "%m/%d/%Y"
}
}
}
}
])
Ergebnis:
{ "_id" : 4, "date" : ISODate("2020-07-08T00:00:00Z") }
In diesem Fall haben wir angegeben, dass es der 8. Tag des 7. Monats ist.
Hier ist es wieder, aber diesmal vertauschen wir Tag und Monat.
db.foo.aggregate([
{ $match: { _id: 4 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
format: "%d/%m/%Y"
}
}
}
}
])
Ergebnis:
{ "_id" : 4, "date" : ISODate("2020-08-07T00:00:00Z") }
Dieses Mal wird es als der 7. Tag des 8. Monats interpretiert.
Siehe MongoDB $dateFromString
Formatbezeichner für eine Liste gültiger Formatbezeichner.
ISO-Wochendatumsformat
Es gibt einige Formatbezeichner, mit denen Sie Datumsangaben im ISO 8601-Format angeben 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 ein Dokument, das so aussieht:
{ "_id" : 5, "bar" : "7-8-2020" }
Wir könnten dieses Datum als den 7. Tag der ISO-Woche interpretieren, gefolgt von der 8. ISO-Woche des Jahres, gefolgt vom Jahr.
So:
db.foo.aggregate([
{ $match: { _id: 5 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
format: "%u-%V-%G"
}
}
}
}
])
Ergebnis:
{ "_id" : 5, "date" : ISODate("2020-02-23T00:00:00Z") }
Geben Sie eine Zeitzone an
Sie können eine Zeitzone angeben, die mit $dateFromString
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.foo.aggregate([
{ $match: { _id: 1 } },
{
$project: {
utc: {
$dateFromString: {
dateString: '$bar',
timezone: "UTC"
}
},
honolulu: {
$dateFromString: {
dateString: '$bar',
timezone: "Pacific/Honolulu"
}
},
auckland: {
$dateFromString: {
dateString: '$bar',
timezone: "Pacific/Auckland"
}
}
}
}
]).pretty()
Ergebnis:
{ "_id" : 1, "utc" : ISODate("2020-12-31T23:30:25.123Z"), "honolulu" : ISODate("2021-01-01T09:30:25.123Z"), "auckland" : ISODate("2020-12-31T10:30:25.123Z") }
UTC-Offset
Hier ist ein Beispiel, das den UTC-Offset verwendet.
db.foo.aggregate([
{ $match: { _id: 1 } },
{
$project: {
"date+00:00": {
$dateFromString: {
dateString: '$bar',
timezone: "+00:00"
}
},
"date-10:00": {
$dateFromString: {
dateString: '$bar',
timezone: "-10:00"
}
},
"date+12:00": {
$dateFromString: {
dateString: '$bar',
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") }
Wenn Sie die timezone
verwenden -Parameter kann die Datumszeichenfolge nicht mit einem Z angehängt werden, um die Zulu-Zeit (UTC-Zeitzone) anzugeben. Beispielsweise darf die Datumszeichenfolge nicht 2020-12-31T23:30:25.123Z
sein bei Verwendung des Zeitzonenparameters.
Fügen Sie außerdem keine Zeitzoneninformationen in die Datumszeichenfolge ein, wenn Sie den Zeitzonenparameter verwenden.
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.
Angenommen, wir haben ein Dokument wie dieses:
{ "_id" : 6, "bar" : null }
Wir könnten onNull
verwenden wie folgt:
db.foo.aggregate([
{ $match: { _id: 6 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
onNull: "No valid date was supplied"
}
}
}
}
])
Ergebnis:
{ "_id" : 6, "date" : "No valid date was supplied" }
In diesem Fall war das Datum null
und so enthält das Ausgabedokument die Zeichenfolge, die ich für onNull
bereitgestellt habe Parameter.
Der onError
Parameter
Sie können optional den onError
verwenden Parameter, um einen Ausdruck bereitzustellen, der ausgegeben wird, falls ein Fehler auftritt.
Angenommen, unsere Sammlung enthält das folgende Dokument:
{ "_id" : 7, "bar" : "21st Dec, 2030" }
Obwohl in der bar
ein Datum steht -Feld, ist es keine gültige Datums-/Uhrzeitzeichenfolge und wird daher einen Fehler verursachen, wenn wir dateFromString
verwenden zu versuchen, es in ein Datumsobjekt umzuwandeln.
Fehlerbeispiel:
db.foo.aggregate([
{ $match: { _id: 7 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar'
}
}
}
}
])
Ergebnis:
Error: command failed: { "ok" : 0, "errmsg" : "an incomplete date/time string has been found, with elements missing: \"21st Dec, 2030\"", "code" : 241, "codeName" : "ConversionFailure" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:618:17 [email protected]/mongo/shell/assert.js:708:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1046:12 @(shell):1:1
Das ist ein hässlich aussehender Fehler.
Wir können den onError
verwenden Parameter, um es schöner aussehen zu lassen:
db.foo.aggregate([
{ $match: { _id: 7 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
onError: "An error occurred while parsing the date string"
}
}
}
}
])
Ergebnis:
{ "_id" : 7, "date" : "An error occurred while parsing the date string" }
Als onNull
sehen und onError
Parameter erlauben es uns, die eigentlichen Dokumente zurückzugeben, sie erlauben uns, mehrere Dokumente zurückzugeben, ohne uns Sorgen machen zu müssen, dass ein fehlerhaftes Dokument den gesamten Vorgang anhält.
Beispiel:
db.foo.aggregate([
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
onNull: "The date was either empty or null",
onError: "An error occurred while parsing the date string"
}
}
}
}
])
Ergebnis:
{ "_id" : 1, "date" : ISODate("2020-12-31T23:30:25.123Z") } { "_id" : 2, "date" : ISODate("2020-12-31T00:00:00Z") } { "_id" : 3, "date" : ISODate("2020-12-31T23:30:00Z") } { "_id" : 4, "date" : ISODate("2020-07-08T00:00:00Z") } { "_id" : 5, "date" : ISODate("2020-08-07T00:00:00Z") } { "_id" : 6, "date" : "The date was either empty or null" } { "_id" : 7, "date" : "An error occurred while parsing the date string" }