MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB $toObjectId

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.