Depuis MongoDB 4.0, vous pouvez utiliser le $toObjectId
opérateur de pipeline d'agrégation pour convertir une chaîne en ObjectId.
La chaîne doit être une chaîne hexadécimale de longueur 24.
Exemple
Supposons que nous ayons une collection appelée foo
et il contient le document suivant :
{ "_id" : 1, "bar" : "6008c9a5c8eb4369cf6ad9cc" }
Nous pouvons utiliser le $toObjectId
opérateur pour convertir le bar
champ à un ObjectId.
db.foo.aggregate(
[
{
$project:
{
_id: 0,
bar: { $toObjectId: "$bar" }
}
}
]
).pretty()
Résultat :
{ "bar" : ObjectId("6008c9a5c8eb4369cf6ad9cc") }
Maintenant, la chaîne a été convertie en ObjectId comme spécifié.
Erreurs
L'exemple ci-dessus a fonctionné car nous avons fourni une chaîne hexadécimale de longueur 24 au $toObjectId
opérateur.
Voici ce qui se passe lorsque nous fournissons une valeur qui n'est pas une chaîne hexadécimale de longueur 24 :
db.foo.aggregate(
[
{
$project:
{
_id: 0,
bar: { $toObjectId: "$_id" }
}
}
]
).pretty()
Résultat :
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
Cette erreur interrompt toute l'opération d'agrégation et fournit une erreur d'apparence désagréable.
Une autre approche consiste à utiliser le $convert
opérateur au lieu de $toObjectId
. Le $convert
vous permet de gérer les erreurs sans affecter l'ensemble de l'opération d'agrégation.
Le $toObjectId
est l'équivalent d'utiliser le $convert
opérateur pour convertir une valeur en ObjectId.
Voici le même exemple en utilisant $convert
:
db.foo.aggregate(
[
{
$project:
{
_id: 0,
result:
{
$convert: {
input: "$_id",
to: "objectId",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
}
]
)
Résultat :
{ "result" : "An error occurred" }
Utiliser $convert
nous a permis de spécifier le message d'erreur à utiliser lorsque l'erreur s'est produite, et cela n'a pas interrompu l'ensemble de l'opération d'agrégation.
Voir MongoDB $convert
pour plus d'exemples.