sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB $convertir

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" }