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
gibt1
zurück für einen booleschen Wert vontrue
, und0
für einen booleschen Wert vonfalse
.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" }