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

MongoDB $toObjectId

Desde MongoDB 4.0, puede usar $toObjectId operador de canalización de agregación para convertir una cadena en un ObjectId.

La cadena debe ser una cadena hexadecimal de longitud 24.

Ejemplo

Supongamos que tenemos una colección llamada foo y contiene el siguiente documento:

{ "_id" : 1, "bar" : "6008c9a5c8eb4369cf6ad9cc" } 

Podemos usar el $toObjectId operador para convertir la bar campo a un ObjectId.

db.foo.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          bar: { $toObjectId: "$bar" }
        }
    }
  ]
).pretty()

Resultado:

{ "bar" : ObjectId("6008c9a5c8eb4369cf6ad9cc") } 

Ahora la cadena se ha convertido en un ObjectId como se especifica.

Errores

El ejemplo anterior funcionó porque proporcionamos una cadena hexadecimal de longitud 24 al $toObjectId operador.

Esto es lo que sucede cuando proporcionamos un valor que no es una cadena hexadecimal de longitud 24:

db.foo.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          bar: { $toObjectId: "$_id" }
        }
    }
  ]
).pretty()

Resultado:

Error: command failed: {
	"ok" : 0,
	"errmsg" : "Unsupported conversion from double to objectId in $convert with no onError value",
	"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

Este error detiene toda la operación de agregación y proporciona un error de apariencia desagradable.

Un enfoque alternativo es usar el $convert operador en lugar de $toObjectId . El $convert operador le permite manejar errores sin afectar toda la operación de agregación.

El $toObjectId operador es el equivalente de usar el $convert operador para convertir un valor en un ObjectId.

Aquí está el mismo ejemplo usando $convert :

db.foo.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          result: 
          {
            $convert: { 
              input: "$_id", 
              to: "objectId",
              onError: "An error occurred",
              onNull: "Input was null or empty" 
            }
          }
        }
    }
  ]
)

Resultado:

{ "result" : "An error occurred" } 

Usando $convert nos permitió especificar el mensaje de error que se usaría cuando ocurriera el error y no detuvo toda la operación de agregación.

Ver MongoDB $convert para más ejemplos.