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 más información sobre expresiones, consulte 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 | ||||||||||||||||||||||||||||||
| Obligatorio al convertir hacia o desde | 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 genera un error al encontrar un error y se detiene. | ||||||||||||||||||||||||||||||
| Opcional | Valor que se devolverá si Si no se especifica, |
Además de, MongoDB proporciona los siguientes operadores de agregación como abreviatura cuando el comportamiento predeterminado "onError" y "onNull" es $convert 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 y el subtipo originales: no se realiza ninguna conversión. Las versiones de MongoDB anteriores a 8.0 no permiten la conversión de binData.
Convertir de tipos numéricos binData a:
Al convertir un tipo numérico a binData:
Un
intse convierte en un 4bytebinData.Un
longse convierte en un 8bytebinData.Un
doublese convierte en un 8bytebinData.
El valor predeterminado del byteOrder en la salida numérica es "little", es decir, el byte menos significativo se coloca primero. Por el contrario, "big" coloca primero el byte más significativo.
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 y el subtipo originales: no se realiza ninguna conversión. Las versiones de MongoDB anteriores a 8.0 no permiten la 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 | No-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 |
MaxKey | 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, consulte Tipos BSON.
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 La cantidad de bytes en el valor Si la longitud de |
Double | Retorna un valor truncado. El valor doble truncado debe estar dentro del valor mínimo y máximo de un 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 estar dentro del valor mínimo y máximo de un número entero. No se puede convertir un valor decimal cuyo valor truncado sea menor que el valor entero mínimo o mayor que el valor entero máximo. |
entero | No-op. 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 cadena debe ser un 10 entero base (por No se puede convertir un valor de cadena de un número flotante, decimal o no base (por 10 |
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 no vá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 doble como decimal. |
Decimal | No-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 cadena como decimal. El valor de la cadena debe ser un 10 valor numérico base (por No se puede convertir un valor de cadena de un número que 10 |
fecha | Devuelve el número de milisegundos desde la época 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 al doble
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 | Devuelve el valor El número de bytes en el valor Si la longitud de |
Double | No-op. Devuelve el doble. |
Decimal | Devuelve el valor decimal como doble. El valor decimal debe estar dentro del valor mínimo y máximo para un doble. 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 doble. |
Long | Devuelve el valor largo como doble. |
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 10 |
fecha | Devuelve el número de milisegundos desde la época 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 | |||||
| 50000000000 | |||||
| 1522039108044 | |||||
| 4.814824932714571e-36 | |||||
| Error: No se pudo convertir binData debido a una longitud no válida: 2 |
Tip
Convertir a largo
La siguiente tabla enumera los tipos de entrada que se pueden convertir a largo:
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 doble truncado debe estar dentro del valor mínimo y máximo para un valor largo. No se puede convertir un valor doble cuyo valor truncado sea menor que el valor largo mínimo o mayor que el valor largo máximo. |
Decimal | Retorna un valor truncado. El valor decimal truncado debe estar dentro del valor mínimo y máximo durante un largo. No se puede convertir un valor decimal cuyo valor truncado sea menor que el valor largo mínimo o mayor que el valor largo máximo. |
entero | Devuelve el valor int como un largo. |
Long | No opera. Devuelve el valor largo. |
String | Devuelve el valor numérico de la cadena. El valor de la cadena debe tener una longitud base 10 (por No se puede convertir un valor de cadena de un número flotante, decimal o no base (por 10 |
fecha | Convierte la fecha en número de milisegundos desde la época. |
La siguiente tabla enumera algunos ejemplos de conversión a largos:
Ejemplo | Resultados | |||||
|---|---|---|---|---|---|---|
| Largo("1") | |||||
| Largo("0") | |||||
| Largo("2") | |||||
| Largo("5") | |||||
| Error | |||||
| Largo("8") | |||||
| Long("1522039108044") | |||||
| Largo("-2") | |||||
| Error | |||||
| nulo | |||||
| Largo("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. El 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 de enero 1, 1970. |
Decimal | Devuelve una fecha que corresponde a la cantidad de milisegundos representados por el valor decimal truncado. El 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 de enero 1, 1970. |
Long | Devuelve una fecha que corresponde a la cantidad de milisegundos representados por el valor largo. El 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 de enero 1, 1970. |
String | Devuelve una fecha que corresponde a la string de fecha. La cadena debe ser una cadena de fecha válida, como por ejemplo:
|
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 | ||||
|---|---|---|---|---|---|
| FechaISO("1973-10-20T21:20:00.000Z") | ||||
| FechaISO("2009-09-19T14:53:56.000Z") | ||||
| FechaISO("2004-11-09T11:33:20.000Z") | ||||
| FechaISO("1935-02-22T12:26:40.000Z") | ||||
| FechaISO("2018-03-27T04:08:58.000Z") | ||||
| ISODate("2018-03-03T00:00:00.000Z") | ||||
| FechaISO("2018-03-20T06:00:06.000Z") | ||||
| Error | ||||
| FechaISO("2021-11-23T17:21:58.000Z") |
Tip
$toDateoperador
Convertir a ObjectId
La siguiente tabla enumera los tipos de entrada que se pueden convertir a un ObjectId:
Tipo de entrada | Comportamiento |
|---|---|
String | Devuelve un ObjectId para la string hexadecimal de 24 caracteres. No se puede convertir un valor de cadena que no sea una cadena 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 cadena
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 cadena. |
Booleano | Devuelve el valor booleano como una cadena. |
Double | Devuelve el valor doble como una cadena. |
Decimal | Devuelve el valor decimal como una cadena. |
entero | Devuelve el valor entero como una cadena. |
Long | Devuelve el valor largo como una cadena. |
ObjectId | Devuelve el valor de ObjectId como una cadena hexadecimal. |
String | No-op. Devuelve el valor de la cadena. |
fecha | Devuelve la fecha como una cadena. |
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' }