MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB $toObjectId


A partir do MongoDB 4.0, você pode usar o $toObjectId operador de pipeline de agregação para converter uma string em um ObjectId.

A string deve ser uma string hexadecimal de comprimento 24.

Exemplo


Suponha que tenhamos uma coleção chamada foo e contém o seguinte documento:
{ "_id" : 1, "bar" : "6008c9a5c8eb4369cf6ad9cc" } 

Podemos usar o $toObjectId operador para converter a bar campo para um ObjectId.
db.foo.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          bar: { $toObjectId: "$bar" }
        }
    }
  ]
).pretty()

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

Agora a string foi convertida em um ObjectId conforme especificado.

Erros


O exemplo acima funcionou porque fornecemos uma string hexadecimal de comprimento 24 para o $toObjectId operador.

Veja o que acontece quando fornecemos um valor que não é uma string hexadecimal de comprimento 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

Esse erro interrompe toda a operação de agregação e fornece um erro de aparência desagradável.

Uma abordagem alternativa é usar o $convert operador em vez de $toObjectId . O $convert O operador permite que você lide com erros sem afetar toda a operação de agregação.

O $toObjectId operador é o equivalente a usar o $convert operador para converter um valor em um ObjectId.

Aqui está o mesmo exemplo 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 permitiu especificar a mensagem de erro a ser usada quando o erro ocorreu e não interrompeu toda a operação de agregação.

Veja MongoDB $convert para mais exemplos.