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.