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

MongoDB $convert

In MongoDB können Sie den $convert verwenden Aggregations-Pipeline-Operator zum Konvertieren eines Werts in einen bestimmten Typ.

Sie können jeden gültigen Ausdruck in Double, String, ObjectId, Boolean, Date, Integer, Long oder Decimal umwandeln.

Nicht alle Typen können in einen anderen Typ konvertiert werden. Einige Typen können nur aus einer Teilmenge der verfügbaren MongoDB-Typen konvertiert werden. Beispielsweise können Sie ein Datum nicht in eine ganze Zahl umwandeln.

Sie können optional den onError verwenden Parameter, um anzugeben, was im Fehlerfall zurückgegeben werden soll. Sie können optional den onNull verwenden Parameter, um anzugeben, was zurückgegeben werden soll, wenn der Eingabewert null ist oder fehlt.

Beispieldaten

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

{ "_id" :ObjectId("6011e471c8eb4369cf6ad9d5"), "double" :123.75, "string" :"123", "boolean" :true, "date" :ISODate("2020-12-31T23:30:15.123Z"), "Integer" :123, "long" :NumberLong(123), "decimal" :NumberDecimal("123.75"), "datestring" :"2021-02-15 06:53:55"} 

Die folgenden Beispiele zeigen, wie jedes Feld in andere Typen konvertiert wird.

ObjectId in String umwandeln

Die _id Feld im obigen Dokument ist eine ObjectId. Hier ist ein Beispiel für die Umwandlung der ObjectId in einen String.

db.samples.aggregate(
  [
    {
      $project:
        { 
          result: 
          {
            $convert: { 
              input: "$_id", 
              to: "string",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
).pretty() 

Ergebnis:

{ "_id" :ObjectId("6011e471c8eb4369cf6ad9d5"), "Ergebnis" :"6011e471c8eb4369cf6ad9d5"}

Das Ergebnis ist, dass die hexadezimale Zeichenfolge aus der ObjectId als Zeichenfolge zurückgegeben wird.

Konvertiere Double in Integer

Wenn Sie ein Double in eine ganze Zahl umwandeln, wird der abgeschnittene Wert zurückgegeben.

db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$double", 
              to: "int",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Ergebnis:

{ "Ergebnis" :123 }

Der abgeschnittene Double-Wert muss innerhalb des Mindest- und Höchstwerts für eine Ganzzahl liegen. Wenn dies nicht der Fall ist, tritt ein Fehler auf.

Außerdem können Sie keinen Double-Wert konvertieren, dessen abgeschnittener Wert kleiner als der ganzzahlige Mindestwert oder größer als der ganzzahlige Höchstwert ist.

String in Ganzzahl umwandeln

Wenn Sie eine Zeichenfolge in eine Ganzzahl konvertieren, wird $convert gibt den numerischen Wert des Strings als Integer zurück.

db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$string", 
              to: "int",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Ergebnis:

{ "Ergebnis" :123 }

Der Zeichenfolgenwert muss eine Basis10 sein Ganzzahl (z. B. "-123" , "123" ) und innerhalb des Mindest- und Höchstwerts für eine Ganzzahl liegen.

Boolschen Wert in Ganzzahl umwandeln

Wenn Sie einen booleschen Wert in eine Ganzzahl umwandeln, wird $convert gibt 1 zurück für einen booleschen Wert von true , und 0 für einen booleschen Wert von false .

db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$boolean", 
              to: "int",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Ergebnis:

{ "Ergebnis" :1 }

Datum in Zeichenfolge umwandeln

Sie können $convert verwenden um ein Datum als String zurückzugeben.

db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$date", 
              to: "string",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Ergebnis:

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

Das Date-Objekt wurde in einen String umgewandelt.

Doppelt in Datum umwandeln

Die folgenden Typen können in ein Datum konvertiert werden:

  • doppelt
  • dezimal
  • lang
  • Zeichenfolge
  • Objekt-ID

Hier ist ein Beispiel für die Umwandlung eines Doubles in ein Datum:

db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$double", 
              to: "date",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Ergebnis:

{ "Ergebnis" :ISODate("1970-01-01T00:00:00.123Z") } 

Wenn Sie Zahlen in ein Datum umwandeln, stellt die Zahl die Anzahl der Millisekunden seit dem 1. Januar 1970 dar.

In unserem Beispiel haben wir einen doppelten Wert von 123 angegeben , was seit dem 1. Januar 1970 als 123 Millisekunden interpretiert wurde.

Ganzzahl in Dezimalzahl umwandeln

Hier ist ein Beispiel für die Umwandlung einer Ganzzahl in eine Dezimalzahl:

db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$integer", 
              to: "decimal",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Ergebnis:

{ "Ergebnis" :NumberDecimal("123.000000000000") } 

String in Datum umwandeln

Hier ist ein Beispiel für die Konvertierung einer Datums-/Zeitzeichenfolge in ein Date-Objekt:

db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$datestring", 
              to: "date",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Ergebnis:

{ "Ergebnis" :ISODate("2021-02-15T06:53:55Z") } 

Wenn Sie eine Zeichenfolge in ein Datumsobjekt konvertieren, muss die Zeichenfolge eine gültige Datumszeichenfolge sein, wie z. B.:

  • 2021-02-15
  • 2021-02-15T06:53:55
  • 2021-02-15T06:53:55Z

In Boolesch umwandeln

Wenn Sie einen Wert in einen booleschen Wert umwandeln, ist das Ergebnis true oder false , abhängig vom Eingabewert.

Im Allgemeinen wird dies für numerische Werte false zurückgeben wenn der Wert Null ist (0 ) und true für jeden anderen Wert.

Für String-, ObjectId- und Date-Werte wird immer true zurückgegeben .

db.samples.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$string", 
              to: "bool",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Ergebnis:

{ "Ergebnis" :wahr }

Der onError Parameter

Sie können den onError verwenden Parameter, um einen bestimmten Wert zurückzugeben, falls ein Fehler auftritt.

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

{ "_id" :1, "name" :"Wag", "born" :"März 2020", "weight" :null }

Nachfolgend finden Sie ein Beispiel für den Versuch, eine Konvertierung durchzuführen, die aufgrund eines Fehlers fehlschlägt. Im ersten Beispiel nicht Verwenden Sie onError .

db.dogs.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$born", 
              to: "int"
            }
          }
        }
    }
  ]
) 

Ergebnis:

Error: command failed: {
	"ok" : 0,
	"errmsg" : "Failed to parse number 'March 2020' in $convert with no onError value: Did not consume whole string.",
	"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 führte dazu, dass eine böse Fehlermeldung angezeigt wurde.

Das folgende Beispiel zeigt, wie wir dies schöner machen können, indem wir den onError verwenden Parameter.

db.dogs.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$born", 
              to: "int",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Ergebnis:

{ "Ergebnis" :"Ein Fehler ist aufgetreten" }

Beachten Sie, dass das Dokument immer noch zurückgegeben wird und unsere benutzerdefinierte Fehlermeldung im Feld angezeigt wird.

Der onNull Parameter

Sie können optional den onNull verwenden Parameter, um anzugeben, was zurückgegeben werden soll, wenn der Eingabewert null ist oder fehlt.

Mit dem vorherigen Dokument können wir den onNull testen Parameter wie folgt:

db.dogs.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$weight", 
              to: "decimal",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
) 

Ergebnis:

{ "Ergebnis" :"Eingabe war null oder leer" }