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.