🛢️Parcours Fioul GroupéMongoDB · Chapitre 10
Accueil › MongoDB › Chapitre 10
Chapitre 10 / 17

La validation des schémas

L'absence de schéma imposé est une force, mais on veut souvent garantir un minimum de structure : champs obligatoires, types corrects, valeurs autorisées. MongoDB permet cela avec un validateur basé sur $jsonSchema, sans perdre la souplesse.

1 Notion

Pourquoi valider ?

Sans garde-fou, rien n'empêche d'insérer une campagne sans zone, ou avec un statut écrit « ouvert » au lieu de « OUVERTE ». La validation pose des règles minimales vérifiées à chaque insertion/mise à jour, tout en laissant les champs non listés libres.

Équilibre — on valide ce qui est critique (présence, type, énumération) sans figer tout le document : on garde la souplesse d'ajouter de nouveaux champs.
2 Notion

Déclarer un validateur avec $jsonSchema

À la création d'une collection, on fournit un validator décrit par $jsonSchema : champs requis et propriétés attendues.

db.createCollection("campagnes", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["zone", "statut", "dateLimite"],
      properties: {
        zone:   { bsonType: "string" },
        statut: { bsonType: "string" }
      }
    }
  }
})
3 Notion

Types & contraintes

On précise le bsonType de chaque champ et des contraintes simples (min, max, longueur…).

properties: {
  litres:     { bsonType: "int", minimum: 500 },
  prixLitre:  { bsonType: "double" },
  commandes:  { bsonType: "array" }
}
Attention aux types — "int" et "double" sont distincts en BSON (chapitre 16). Dans mongosh, un nombre écrit 1500 peut être un double ; utilise NumberInt(1500) si tu veux un entier.
4 Notion

Restreindre à des valeurs autorisées (enum)

enum limite un champ à une liste de valeurs — parfait pour un statut.

statut: {
  bsonType: "string",
  enum: ["OUVERTE", "CLOTUREE", "LIVREE"]
}

Une insertion invalide est refusée

MongoServerError: Document failed validation
5 Pratique

Ajouter un validateur à une collection existante

Sur une collection déjà créée, on utilise collMod.

db.runCommand({
  collMod: "campagnes",
  validator: { $jsonSchema: { /* ... */ } }
})
6 Notion

Niveau & action de validation

Deux réglages ajustent la sévérité :

🛢️ Sur le projet Fioul Groupé

Pose un validateur sur campagnes : zone et statut requis, statut dans l'enum ["OUVERTE","CLOTUREE","LIVREE"], litres ≥ 500 sur les commandes. Tu obtiens le même filet de sécurité que la validation @Valid côté Spring — les deux se complètent (défense en profondeur, à relier au cours Cyber).

Ce qu'il faut retenir du chapitre
  • La validation pose des règles minimales sans figer le document.
  • $jsonSchema : required, bsonType, enum, min/max.
  • collMod pour une collection existante.
  • validationLevel / validationAction règlent la sévérité.
← Chapitre 09