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

MongoDB $dateFromString

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