Definición
Compatibilidad
Puedes usar $convert para implementaciones alojadas en los siguientes entornos:
MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB
MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.
Sintaxis
Cambiado en la versión 8.0.
{ $convert: { input: <expression>, to: <type expression> || { type: <type expression>, subtype: <int> }, format: <string>, onError: <expression>, onNull: <expression> } }
El $convert procesa un documento con los siguientes campos:
Campo | Necesidad | Descripción | ||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Requerido | El argumento puede ser cualquier expresión válida. Para obtener más información sobre las expresiones, consulta Expresiones. A partir de MongoDB 8.1, puede establecer el campo
MongoDB también admite estos tipos numéricos como entrada al convertir un valor a | ||||||||||||||||||||||||||||||
| Requerido | Especifica el tipo al que se convertirá la expresión
| ||||||||||||||||||||||||||||||
| Obligatorio si se especifica | El argumento puede ser cualquier expresión válida que se resuelva en uno de los siguientes identificadores numéricos o de cadena:
| ||||||||||||||||||||||||||||||
| Opcional | Si
Predeterminado: 0 (subtipo binario genérico) | ||||||||||||||||||||||||||||||
| Opcional | Especifica el orden de bytes big-endian o little-endian para las conversiones entre | ||||||||||||||||||||||||||||||
| Requerido al convertir de | Especifica el formato de las conversiones entre
Si | ||||||||||||||||||||||||||||||
| Opcional | Valor que se devolverá si se detecta un error durante la conversión, incluidas las conversiones de tipos no compatibles. Los argumentos pueden ser cualquier expresión válida. Si no se especifica, la operación arroja un error al encontrar un error y se detiene. | ||||||||||||||||||||||||||||||
| Opcional | Valor que se debe devolver si el Si no se especifica, |
Además de $convert, MongoDB proporciona los siguientes operadores de agregación como atajo cuando el comportamiento por defecto "onError" y "onNull" es aceptable:
Comportamiento
Las siguientes secciones describen cómo convertir valores a diferentes tipos.
Convertir a BinData
A partir de MongoDB 8.1, puede establecer el campo to en binData si establece el campo input en uno de los siguientes tipos:
intlongdouble
A partir de MongoDB 8.1, $convert devuelve un error al intentar convertir entre diferentes subtipos de binData. En MongoDB 8.0, $convert devuelve el valor original y el subtipo original: no se realiza ninguna conversión. Las versiones de MongoDB anteriores a la 8.0 no realizan conversión de binData.
Convertir de tipos numéricos binData a:
Al convertir un tipo numérico a binData:
Un
intse convierte en unbinDatade 4bytes.Un
longse convierte en un 8-bytebinData.Un
doublese convierte en un 8-bytebinData.
El byteOrder de la salida numérica por defecto es "little" o la colocación del byte menos significativo primero. Por el contrario, "big" coloca el byte más significativo en primer lugar.
Convertir long a binData:
db.t.insertOne({a: Long(42)}) db.t.aggregate([ { $project: { convertedBD: { $convert: { input: Long(42), to: "binData", } }, } } ])
{ _id: ObjectId('67dda0195a99e592590143e8'), convertedBD: Binary.createFromBase64('KgAAAAAAAAA=', 0) }
Convierte long a binData con ordenación de bytes big-endian:
db.t.insertOne({a: Long(42)}) db.t.aggregate([ { $project: { convertedBD: { $convert: { input: Long(42), to: "binData", byteOrder: "big", } }, } } ])
{ _id: ObjectId('67ddb27c5a99e592590143ec'), convertedBD: Binary.createFromBase64('AAAAAAAAACo=', 0), }
Convertir double a binData:
db.t.insertOne({a: Double(42.0)}) db.t.aggregate([ { $project: { convertedBD: { $convert: { input: Double(42), to: "binData", } }, } } ])
{ _id: ObjectId('67ddb3cf5a99e592590143ee'), convertedBD: Binary.createFromBase64('AAAAAAAARUA=', 0) }
Convertir int a binData:
db.t.insertOne({a: 42}) db.t.aggregate([ { $project: { convertedBD: { $convert: { input: 42, to: "binData", } }, } } ])
{ _id: ObjectId('67ddb43a5a99e592590143ef'), convertedBD: Binary.createFromBase64('KgAAAA==', 0) }
Convertir de cadena a BinData
MongoDB también admite conversiones entre binData y cadenas.
Los siguientes ejemplos demuestran cómo convertir cadenas a binData.
Ejemplo | Resultado | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| | |||||||||||
| | |||||||||||
| | |||||||||||
| | |||||||||||
| | |||||||||||
| | |||||||||||
| |
Nota
A partir de MongoDB 8.1, $convert devuelve un error al intentar convertir entre diferentes subtipos de binData. En MongoDB 8.0, $convert devuelve el valor original y el subtipo original: no se realiza ninguna conversión. Las versiones de MongoDB anteriores a la 8.0 no realizan conversión de binData.
Convertir a Booleano
La siguiente tabla enumera los tipos de entrada que se pueden convertir a un valor booleano:
Tipo de entrada | Comportamiento |
|---|---|
Arreglo | Devuelve verdadero |
Datos binarios | Devuelve verdadero |
Booleano | Sin-op. Devuelve el valor booleano. |
Código | Devuelve verdadero |
fecha | Devuelve verdadero |
Decimal | Returns true if not zero Return false if zero |
Double | Returns true if not zero Return false if zero |
entero | Returns true if not zero Return false if zero |
JavaScript | Devuelve verdadero |
Long | Returns true if not zero Return false if zero |
Clave máxima | Devuelve verdadero |
MinKey | Devuelve verdadero |
Nulo | Devuelve el valor especificado para la opción |
Objeto | Devuelve verdadero |
ObjectId | Devuelve verdadero |
Expresión regular | Devuelve verdadero |
String | Devuelve verdadero |
Marca de tiempo | Devuelve verdadero |
Para obtener más información sobre los tipos de datos en MongoDB, consulta BSON Types.
La siguiente tabla enumera algunos ejemplos de conversión a valores booleanos:
Ejemplo | Resultados | ||||
|---|---|---|---|---|---|
| true | ||||
| false | ||||
| true | ||||
| true | ||||
| false | ||||
| true | ||||
| true | ||||
| true | ||||
| true | ||||
| true | ||||
| Nulo |
Tip
Convertir a entero
La siguiente tabla enumera los tipos de entrada que se pueden convertir a un número entero:
Tipo de entrada | Comportamiento |
|---|---|
Booleano | Returns 0 for false.Returns 1 for true. |
BinData | Devuelve el valor El número de bytes en el valor Si la longitud de |
Double | Retorna un valor truncado. El valor double truncado debe estar dentro del valor mínimo y máximo para un número entero. No se puede convertir un valor doble cuyo valor truncado sea menor que el valor entero mínimo o mayor que el valor entero máximo. |
Decimal | Retorna un valor truncado. El valor decimal truncado debe encontrarse dentro del valor mínimo y máximo de un entero. No puedes convertir un valor decimal cuyo valor truncado sea menor que el valor entero mínimo o mayor que el valor entero máximo. |
entero | Sin operación. Devuelve el valor entero. |
Long | Devuelve el valor largo como un entero. El valor largo debe estar dentro del valor mínimo y máximo para un entero. No se puede convertir un valor largo que sea menor que el valor entero mínimo o mayor que el valor entero máximo. |
String | Devuelve el valor numérico de la cadena como un entero. El valor de la string debe ser un número entero en base 10 (por ejemplo, No se puede convertir un valor string de un número decimal o de punto flotante, ni tampoco de un número que no sea en base 10 (por ejemplo, |
La siguiente tabla enumera algunos ejemplos de conversión a números enteros:
Ejemplo | Resultados | |||||
|---|---|---|---|---|---|---|
| 1 | |||||
| 0 | |||||
| 1 | |||||
| 5 | |||||
| Error | |||||
| 5000 | |||||
| Error | |||||
| -2 | |||||
| Error | |||||
| Nulo | |||||
| 1048576 | |||||
| -1763180545 | |||||
| Error: No se pudo convertir BinData debido a una longitud inválida: 7 |
Tip
$toInt operador.
Convertir a decimal
La siguiente tabla enumera los tipos de entrada que se pueden convertir a decimal:
Tipo de entrada | Comportamiento |
|---|---|
Booleano | Returns Decimal128( "0" ) for false.Returns Decimal128( "1" ) for true. |
Double | Devuelve el valor double como un decimal. |
Decimal | Sin-op. Devuelve el decimal. |
entero | Devuelve el valor int como decimal. |
Long | Devuelve el valor largo como decimal. |
String | Devuelve el valor numérico de la string como un número decimal. El valor de la cadena debe ser un valor numérico base 10 (por No puedes convertir un valor de string de un número que no sea de 10 como base (por ejemplo, |
fecha | Devuelve la cantidad de milisegundos desde la Unix epoch que corresponde al valor de la fecha. |
La siguiente tabla enumera algunos ejemplos de conversión a decimales:
Ejemplo | Resultados | ||||
|---|---|---|---|---|---|
| Decimal128("1") | ||||
| Decimal128("0") | ||||
| Decimal128( "2.50000000000000" ) | ||||
| Decimal128("5") | ||||
| Decimal128("10000") | ||||
| Decimal128("-5.5") | ||||
| Decimal128("1522039108044") |
Tip
Convertir a double
La siguiente tabla enumera los tipos de entrada que se pueden convertir a doble:
Tipo de entrada | Comportamiento |
|---|---|
Booleano | Returns NumberDouble(0) for false.Returns NumberDouble(1) for true. |
BinData | Retorna el valor El número de bytes en el valor Si la longitud de |
Double | Sin operación. Devuelve el double. |
Decimal | Devuelve el valor decimal como un double. El valor decimal debe estar dentro del valor mínimo y máximo para un double. No se puede convertir un valor decimal cuyo valor sea menor que el valor doble mínimo o mayor que el valor doble máximo. |
entero | Devuelve el valor int como un double. |
Long | Devuelve el valor largo como un double. |
String | Retorna el valor numérico de la string como un doble. El valor de cadena debe ser un valor numérico en base 10 (ejemplo, No se puede convertir un valor de cadena de un número que no sea de base 10 (por |
fecha | Devuelve la cantidad de milisegundos desde la Unix epoch que corresponde al valor de la fecha. |
La siguiente tabla enumera algunos ejemplos de conversión a doble:
Ejemplo | Resultados | |||||
|---|---|---|---|---|---|---|
| 1 | |||||
| 0 | |||||
| 2.5 | |||||
| 5 | |||||
| 10000 | |||||
| -5.5 | |||||
| 50.000.000.000 | |||||
| 1522039108044 | |||||
| 4.814824932714571e-36 | |||||
| Error: No se pudo convertir binData debido a una longitud inválida: 2 |
Tip
Convertir a largo
La siguiente tabla enumera los tipos de entrada que pueden convertirse a un "long":
Tipo de entrada | Comportamiento |
|---|---|
Booleano | Returns 0 for false.Returns 1 for true. |
BinData | Devuelve el valor El número de bytes en el valor Si la longitud de |
Double | Retorna un valor truncado. El valor double truncado debe estar dentro del valor mínimo y máximo para un largo. No se puede convertir un valor double cuyo valor truncado es inferior al valor mínimo de long o superior al valor máximo de long. |
Decimal | Retorna un valor truncado. El valor decimal truncado debe estar dentro del valor mínimo y máximo para un entero largo. No puedes convertir un valor decimal cuyo valor truncado sea inferior al valor mínimo de long o supere el valor máximo de long. |
entero | Devuelve el valor int como un long. |
Long | No opera. Devuelve el valor largo. |
String | Devuelve el valor numérico de la string. El valor de la string debe ser un entero largo decimal 10 (p. ej. No se puede convertir un valor en string de un flotante, decimal o número que no sea base 10 (por ejemplo, |
fecha | Convierte la fecha en el número de milisegundos transcurridos desde la Unix epoch. |
La siguiente tabla enumera algunos ejemplos de conversión a largos:
Ejemplo | Resultados | |||||
|---|---|---|---|---|---|---|
| Long("1") | |||||
| Largo("0") | |||||
| Largo("2") | |||||
| Prolongado ("5") | |||||
| Error | |||||
| Largo("8") | |||||
| Long("1522039108044") | |||||
| large("-2") | |||||
| Error | |||||
| Nulo | |||||
| Long("1048576") |
Tip
Convertir a Fecha
La siguiente tabla enumera los tipos de entrada que se pueden convertir a una fecha:
Tipo de entrada | Comportamiento |
|---|---|
Double | Devuelve una fecha que corresponde a la cantidad de milisegundos representados por el valor doble truncado. Un número positivo corresponde al número de milisegundos desde el 1 de enero de 1970. El número negativo corresponde al número de milisegundos antes del 1 de enero de 1970. |
Decimal | Devuelve una fecha que corresponde a la cantidad de milisegundos representados por el valor decimal truncado. Un número positivo corresponde al número de milisegundos desde el 1 de enero de 1970. El número negativo corresponde al número de milisegundos antes del 1 de enero de 1970. |
Long | Devuelve una fecha que corresponde al número de milisegundos representados por el valor long. Un número positivo corresponde al número de milisegundos desde el 1 de enero de 1970. El número negativo corresponde al número de milisegundos antes del 1 de enero de 1970. |
String | Devuelve una fecha que corresponde a la string de fecha. La string debe ser una string de fecha válida, como:
|
ObjectId | Devuelve una fecha que corresponde a la marca de tiempo del ObjectId. |
Marca de tiempo | Devuelve una fecha que corresponde a la marca de tiempo. |
La siguiente tabla enumera algunos ejemplos de conversión a fecha:
Ejemplo | Resultados | ||||
|---|---|---|---|---|---|
| ISODate("1973-10-20T21:20:00.000Z") | ||||
| ISODate("2009-09-19T14:53:56.000Z") | ||||
| Fecha ISO("2004-11-09T11:33:20.000Z") | ||||
| Fecha ISO("1935-02-22T12:26:40.000Z") | ||||
| ISODate("2018-03-27T04:08:58.000Z") | ||||
| ISODate("2018-03-03T00:00:00.000Z") | ||||
| ISODate("2018-03-20T06:00:06.000Z") | ||||
| Error | ||||
| Fecha ISO("2021-11-23T17:21:58.000Z") |
Tip
$toDateoperador
Convertir a ObjectId
La siguiente tabla enumera los tipos de entrada que se pueden convertir en un ObjectId:
Tipo de entrada | Comportamiento |
|---|---|
String | Devuelve un ObjectId para la string hexadecimal de 24 caracteres. No puedes convertir un valor de string que no sea una string hexadecimal de longitud 24. |
La siguiente tabla enumera algunos ejemplos de conversión a fecha:
Ejemplo | Resultados | ||||
|---|---|---|---|---|---|
| ObjectId("5ab9cbfa31c2ab715d42129e") | ||||
| Error |
Tip
$toObjectId operador.
Convertir a string
La siguiente tabla enumera los tipos de entrada que se pueden convertir en una cadena:
Tipo de entrada | Comportamiento |
|---|---|
BinData | Devuelve el valor de datos binarios como una string. |
Booleano | Devuelve el valor booleano como una cadena. |
Double | Devuelve el valor double como una string. |
Decimal | Devuelve el valor decimal como una string. |
entero | Devuelve el valor entero como una string. |
Long | Devuelve el valor largo como una cadena. |
ObjectId | Devuelve el valor de ObjectId como una string hexadecimal. |
String | Sin-op. Devuelve el valor de string. |
fecha | Devuelve la fecha como una string. |
La siguiente tabla enumera algunos ejemplos de conversión a string:
Ejemplo | Resultados | |||||
|---|---|---|---|---|---|---|
| "true" | |||||
| "FALSO" | |||||
| "2,5" | |||||
| "2" | |||||
| "1000" | |||||
| "5ab9c3da31c2ab715d421285" | |||||
| "2018-03-27T16:58:51.538Z" | |||||
| 'hn3f' |
Tip
$toStringoperador
Ejemplo
Cree una colección orders con los siguientes documentos:
db.orders.insertMany( [ { _id: 1, item: "apple", qty: 5, price: 10 }, { _id: 2, item: "pie", qty: 10, price: Decimal128("20.0") }, { _id: 3, item: "ice cream", qty: 2, price: "4.99" }, { _id: 4, item: "almonds" }, { _id: 5, item: "bananas", qty: 5000000000, price: Decimal128("1.25") } ] )
La siguiente operación de agregación en la colección orders convierte el price en decimal:
// Define stage to add convertedPrice and convertedQty fields with // the converted price and qty values. // If price or qty values are missing, the conversion returns a // value of decimal value or int value of 0. // If price or qty values cannot be converted, the conversion returns // a string priceQtyConversionStage = { $addFields: { convertedPrice: { $convert: { input: "$price", to: "decimal", onError: "Error", onNull: Decimal128("0") } }, convertedQty: { $convert: { input: "$qty", to: "int", onError:{ $concat: [ "Could not convert ", { $toString:"$qty" }, " to type integer." ] }, onNull: Int32("0") } }, } }; totalPriceCalculationStage = { $project: { totalPrice: { $switch: { branches: [ { case: { $eq: [ { $type: "$convertedPrice" }, "string" ] }, then: "NaN" }, { case: { $eq: [ { $type: "$convertedQty" }, "string" ] }, then: "NaN" }, ], default: { $multiply: [ "$convertedPrice", "$convertedQty" ] } } } } }; db.orders.aggregate( [ priceQtyConversionStage, totalPriceCalculationStage ])
La operación devuelve los siguientes documentos:
{ _id: 1, totalPrice: Decimal128("50") }, { _id: 2, totalPrice: Decimal128("200.0") }, { _id: 3, totalPrice: Decimal128("9.98") }, { _id: 4, totalPrice: Decimal128("0") }, { _id: 5, totalPrice: 'NaN' }