Gérer les erreurs MongoDB

MongoDBBeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire, vous apprendrez les techniques essentielles pour gérer les erreurs courantes dans MongoDB. En utilisant le MongoDB Shell (mongosh), vous pratiquerez l'identification et la résolution de divers problèmes, notamment les échecs de connexion, les erreurs de clé dupliquée et les erreurs de validation des données. À la fin de ce laboratoire, vous aurez une compréhension pratique de la manière de rendre vos opérations de base de données plus fiables et robustes.

Connexion à MongoDB et gestion des erreurs

Les erreurs de connexion sont un problème courant lorsque l'on travaille avec n'importe quelle base de données. Elles peuvent survenir pour plusieurs raisons, telles qu'une adresse de serveur incorrecte, des problèmes réseau ou l'absence de démarrage du serveur de base de données. Dans cette étape, vous apprendrez à identifier une erreur de connexion, puis à vous connecter avec succès.

Tout d'abord, essayez de vous connecter à une instance MongoDB sur un port où elle n'est pas en cours d'exécution. Le port par défaut pour MongoDB est 27017. Nous allons essayer de nous connecter au port 27018.

Exécutez la commande suivante dans votre terminal :

mongosh "mongodb://localhost:27018"

Cette commande échoue et renvoie une erreur car le shell ne trouve pas de serveur MongoDB à l'adresse spécifiée. La sortie ressemblera à ceci :

MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27018

Le MongoNetworkError indique clairement un échec de connexion. La partie ECONNREFUSED vous indique que la machine cible a activement refusé la connexion, ce qui signifie généralement qu'aucun service n'écoute sur ce port.

Maintenant, connectons-nous au bon port. Le service MongoDB a été démarré pour vous pendant la phase de configuration. Pour vous y connecter, exécutez la commande mongosh sans aucun argument. Cela utilisera la chaîne de connexion par défaut mongodb://127.0.0.1:27017.

mongosh

Après une connexion réussie, vous verrez un message de bienvenue et l'invite test>, indiquant que vous êtes connecté à la base de données par défaut test.

Current Mongosh Log ID: ...
Connecting to:          mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.2.6
Using MongoDB:          8.0.0
Using Mongosh:          2.2.6
...
test>

Vous êtes maintenant connecté au serveur MongoDB. Veuillez laisser ce terminal ouvert et rester dans le shell mongosh pour les étapes suivantes.

Gérer les erreurs de clé dupliquée

Le maintien de l'intégrité des données est crucial pour toute application. L'un des problèmes d'intégrité des données les plus courants est la duplication des enregistrements. MongoDB empêche cela grâce à des index uniques, qui garantissent qu'un champ indexé ne stocke pas de valeurs dupliquées.

Vous devriez déjà être dans le shell mongosh de l'étape précédente. Tout d'abord, basculez vers une nouvelle base de données nommée errorlab. Une base de données est créée automatiquement lorsque vous y stockez des données pour la première fois.

use errorlab

Ensuite, créez un index unique sur le champ email dans une nouvelle collection users. Cette commande indique à MongoDB que chaque document de la collection users doit avoir une valeur unique pour le champ email.

db.users.createIndex({ email: 1 }, { unique: true });

La sortie confirme que l'index a été créé avec succès.

{
  "numIndexesBefore": 1,
  "numIndexesAfter": 2,
  "createdCollectionAutomatically": true,
  "ok": 1
}

Maintenant, insérez un document dans la collection users. Cette opération réussira car la collection est vide et l'e-mail est unique.

db.users.insertOne({ name: "John Doe", email: "john@example.com" });

Vous verrez un message de confirmation avec l'ID du document inséré :

{
  "acknowledged": true,
  "insertedId": ObjectId("...")
}

Ensuite, tentez d'insérer un autre document avec la même adresse e-mail.

db.users.insertOne({ name: "Jane Doe", email: "john@example.com" });

Cette fois, l'opération échoue. MongoDB renvoie une MongoBulkWriteError avec un code d'erreur spécifique, E11000, qui signifie une erreur de clé dupliquée. C'est le comportement attendu pour protéger l'intégrité des données.

MongoServerError: E11000 duplicate key error collection: errorlab.users index: email_1 dup key: { email: "john@example.com" }

Résoudre les clés dupliquées avec Upsert

Empêcher les doublons est une bonne pratique, mais parfois vous souhaitez mettre à jour un enregistrement s'il existe ou le créer s'il n'existe pas. Cette logique "mettre à jour ou insérer" est une exigence courante. MongoDB offre un moyen propre de le faire en utilisant l'option upsert.

Essayons de mettre à jour l'utilisateur avec l'e-mail john@example.com. Nous utiliserons la méthode updateOne avec l'option upsert définie sur true.

db.users.updateOne(
  { email: "john@example.com" },
  { $set: { name: "John Doe Updated", lastUpdated: new Date() } },
  { upsert: true }
);

La sortie montre qu'un document a été trouvé et modifié. L'upsertedId est null car un document existant a été mis à jour, et non un nouveau document inséré.

{
  "acknowledged": true,
  "matchedCount": 1,
  "modifiedCount": 1,
  "upsertedId": null
}

Maintenant, exécutons une commande similaire pour un utilisateur qui n'existe pas encore, jane@example.com.

db.users.updateOne(
  { email: "jane@example.com" },
  { $set: { name: "Jane Doe", lastUpdated: new Date() } },
  { upsert: true }
);

Cette fois, la sortie montre que matchedCount est 0, mais un nouveau document a été créé, comme l'indique l'upsertedId.

{
  "acknowledged": true,
  "matchedCount": 0,
  "modifiedCount": 0,
  "upsertedId": ObjectId("...")
}

Pour vérifier les résultats, vous pouvez interroger la collection pour voir tous les documents. La méthode pretty() formate la sortie pour une lecture plus facile.

db.users.find().pretty();

La sortie affichera les deux documents : le document de John avec le nom mis à jour, et le document nouvellement créé de Jane. L'option upsert offre un moyen puissant et atomique de gérer les scénarios "créer ou mettre à jour".

Gérer les erreurs de requête et de validation

Des erreurs peuvent également survenir lorsque vous interrogez des données ou lorsque les données insérées ne respectent pas des règles prédéfinies. Dans cette étape, vous allez explorer une erreur de syntaxe de requête et une erreur de validation de données.

Tout d'abord, voyons ce qui se passe lorsque vous utilisez un opérateur de requête qui n'existe pas. Il s'agit d'une faute de frappe courante.

db.users.find({ name: { $invalidOperator: "John" } });

MongoDB renvoie immédiatement une erreur car il ne reconnaît pas $invalidOperator.

MongoServerError[BadValue]: unknown operator: $invalidOperator

Ensuite, explorons une fonctionnalité plus puissante : la validation de schéma. Vous pouvez définir des règles que les documents doivent respecter pour être insérés ou mis à jour dans une collection. Créons une nouvelle collection products avec un validateur qui exige un name (chaîne de caractères) et un price (nombre).

db.createCollection("products", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["name", "price"],
      properties: {
        name: {
          bsonType: "string",
          description: "must be a string and is required"
        },
        price: {
          bsonType: "number",
          description: "must be a number and is required"
        }
      }
    }
  }
});

Maintenant, tentez d'insérer un document qui viole ce schéma en fournissant le price sous forme de chaîne de caractères au lieu d'un nombre.

db.products.insertOne({ name: "Laptop", price: "1200" });

L'opération échoue avec une MongoBulkWriteError. Le message Document failed validation indique clairement la raison, empêchant ainsi les données incorrectes d'entrer dans votre base de données.

MongoServerError: Document failed validation
...

Enfin, insérez un document valide qui respecte le schéma.

db.products.insertOne({ name: "Laptop", price: 1200 });

Cette opération réussit car le document est valide.

{
  "acknowledged": true,
  "insertedId": ObjectId("...")
}

La validation de schéma est un outil puissant pour garantir la cohérence des données directement dans la base de données.

Résumé

Dans ce laboratoire, vous avez appris à gérer plusieurs types courants d'erreurs MongoDB à l'aide du shell mongosh. Vous avez commencé par identifier et résoudre une erreur de connexion. Ensuite, vous avez renforcé l'intégrité des données en créant un index unique pour éviter les erreurs de clés dupliquées. Vous avez également appris à utiliser l'option upsert pour gérer gracieusement la logique "mettre à jour ou insérer". Enfin, vous avez exploré les erreurs de syntaxe de requête et utilisé la validation de schéma pour empêcher que des données invalides ne soient enregistrées dans votre base de données. Ces compétences fondamentales en gestion des erreurs sont essentielles pour construire des applications fiables et robustes avec MongoDB.