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.