MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB $toObjectId

Da MongoDB 4.0, puoi utilizzare $toObjectId operatore della pipeline di aggregazione per convertire una stringa in un ObjectId.

La stringa deve essere una stringa esadecimale di lunghezza 24.

Esempio

Supponiamo di avere una collezione chiamata foo e contiene il seguente documento:

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

Possiamo usare il $toObjectId operatore per convertire la bar campo a un ObjectId.

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

Risultato:

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

Ora la stringa è stata convertita in un ObjectId come specificato.

Errori

L'esempio sopra ha funzionato perché abbiamo fornito una stringa esadecimale di lunghezza 24 a $toObjectId operatore.

Ecco cosa succede quando forniamo un valore che non è una stringa esadecimale di lunghezza 24:

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

Risultato:

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

Questo errore interrompe l'intera operazione di aggregazione e fornisce un brutto errore di visualizzazione.

Un approccio alternativo consiste nell'usare $convert operatore invece di $toObjectId . Il $convert operatore consente di gestire gli errori senza influire sull'intera operazione di aggregazione.

Il $toObjectId operatore è l'equivalente dell'utilizzo di $convert per convertire un valore in un ObjectId.

Ecco lo stesso esempio usando $convert :

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

Risultato:

{ "result" : "An error occurred" } 

Usando $convert ci ha permesso di specificare il messaggio di errore da utilizzare quando si è verificato l'errore e non ha interrotto l'intera operazione di aggregazione.

Vedi MongoDB $convert per altri esempi.