En MongoDB, puede usar $convert
operador de canalización de agregación para convertir un valor a un tipo específico.
Puede convertir cualquier expresión válida en doble, cadena, ObjectId, booleano, fecha, entero, largo o decimal.
No todos los tipos se pueden convertir a cualquier otro tipo. Algunos tipos solo se pueden convertir a partir de un subconjunto de los tipos MongoDB disponibles. Por ejemplo, no puede convertir una fecha en un número entero.
Opcionalmente, puede usar el onError
parámetro para especificar qué devolver en caso de error. Opcionalmente, puede usar onNull
parámetro para especificar qué devolver si el valor de entrada es nulo o falta.
Datos de muestra
Supongamos que tenemos una colección llamada samples
con el siguiente documento:
{ "_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" }
Los siguientes ejemplos demuestran cómo convertir cada campo a otros tipos.
Convertir ID de objeto en cadena
El _id
El campo en el documento anterior es un ObjectId. Este es un ejemplo de cómo convertir ObjectId en una cadena.
db.samples.aggregate(
[
{
$project:
{
result:
{
$convert: {
input: "$_id",
to: "string",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
).pretty()
Resultado:
{ "_id" : ObjectId("6011e471c8eb4369cf6ad9d5"), "result" : "6011e471c8eb4369cf6ad9d5" }
El resultado es que la cadena hexadecimal de ObjectId se devuelve como una cadena.
Convertir de doble a entero
Cuando convierte un doble en un entero, se devuelve el valor truncado.
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$double",
to: "int",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Resultado:
{ "result" : 123 }
El valor doble truncado debe estar dentro del valor mínimo y máximo de un entero. Si no es así, se producirá un error.
Además, no puede convertir un valor doble cuyo valor truncado sea menor que el valor entero mínimo o mayor que el valor entero máximo.
Convertir cadena a entero
Cuando convierte una cadena en un número entero, $convert
devuelve el valor numérico de la cadena como un número entero.
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$string",
to: "int",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Resultado:
{ "result" : 123 }
El valor de la cadena debe ser una base10 entero (por ejemplo, "-123"
, "123"
) y caen dentro del valor mínimo y máximo para un número entero.
Convertir booleanos a enteros
Cuando convierte un valor booleano en un número entero, $convert
devuelve 1
para un valor booleano de true
y 0
para un valor booleano de false
.
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$boolean",
to: "int",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Resultado:
{ "result" : 1 }
Convertir fecha en cadena
Puedes usar $convert
para devolver una fecha como una cadena.
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$date",
to: "string",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Resultado:
{ "result" : "2020-12-31T23:30:15.123Z" }
El objeto Fecha se ha convertido en una cadena.
Convertir doble a fecha
Los siguientes tipos se pueden convertir en una fecha:
- doble
- decimales
- largo
- cadena
- Id. de objeto
Este es un ejemplo de cómo convertir un doble en una fecha:
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$double",
to: "date",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Resultado:
{ "result" : ISODate("1970-01-01T00:00:00.123Z") }
Cuando convierte números a una fecha, el número representa la cantidad de milisegundos desde el 1 de enero de 1970.
En nuestro ejemplo, proporcionamos un valor doble de 123
, que se interpretó como 123 milisegundos desde el 1 de enero de 1970.
Convertir entero a decimal
Aquí hay un ejemplo de cómo convertir un número entero a decimal:
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$integer",
to: "decimal",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Resultado:
{ "result" : NumberDecimal("123.000000000000") }
Convertir cadena a fecha
Este es un ejemplo de cómo convertir una cadena de fecha/hora en un objeto de fecha:
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$datestring",
to: "date",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Resultado:
{ "result" : ISODate("2021-02-15T06:53:55Z") }
Cuando convierte una cadena en un objeto de fecha, la cadena debe ser una cadena de fecha válida, como:
- 2021-02-15
- 2021-02-15T06:53:55
- 2021-02-15T06:53:55Z
Convertir a booleano
Cuando convierte un valor a booleano, el resultado será true
o false
, dependiendo del valor de entrada.
Generalmente, para valores numéricos, esto devolverá false
si el valor es cero (0
), y true
por cualquier otro valor.
Para valores de cadena, ID de objeto y fecha, siempre devolverá true
.
db.samples.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$string",
to: "bool",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Resultado:
{ "result" : true }
El onError
Parámetro
Puedes usar el onError
parámetro para devolver un valor especificado en caso de que ocurra un error.
Supongamos que tenemos una colección llamada dogs
con el siguiente documento:
{ "_id" : 1, "name" : "Wag", "born" : "March 2020", "weight" : null }
A continuación se muestra un ejemplo de intento de realizar una conversión que falla debido a un error. En el primer ejemplo, no usa onError
.
db.dogs.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$born",
to: "int"
}
}
}
}
]
)
Resultado:
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
Eso dio como resultado que se mostrara un desagradable mensaje de error.
El siguiente ejemplo muestra cómo podemos hacer esto más agradable usando onError
parámetro.
db.dogs.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$born",
to: "int",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Resultado:
{ "result" : "An error occurred" }
Tenga en cuenta que todavía obtenemos el documento devuelto y nuestro mensaje de error personalizado se muestra en el campo.
El onNull
Parámetro
Opcionalmente, puede usar onNull
parámetro para especificar qué devolver si el valor de entrada es nulo o falta.
Usando el documento anterior, podemos probar el onNull
parámetro como este:
db.dogs.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$weight",
to: "decimal",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Resultado:
{ "result" : "Input was null or empty" }