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

Un aperçu de la validation de schéma MongoDB

Tout le monde sait que MongoDB est sans schéma, alors pourquoi est-il nécessaire d'effectuer une validation de schéma ? Il est facile et rapide de développer l'application avec le comportement sans schéma de MongoDB et de l'utiliser comme preuve de concept. Mais une fois que l'application passe en production et devient stable et mature, il n'est pas nécessaire de modifier fréquemment le schéma et ce n'est pas non plus conseillé. À ce stade, il est très important d'appliquer une certaine validation de schéma dans votre base de données pour éviter l'insertion de données indésirables qui pourraient casser votre application. Cela devient beaucoup plus important lorsque des données sont insérées à partir de plusieurs sources dans la même base de données.

La validation de schéma vous permet de définir la structure spécifique des documents dans chaque collection. Si quelqu'un essaie d'insérer des documents qui ne correspondent pas au schéma défini, MongoDB peut rejeter ce type d'opération ou donner des avertissements en fonction du type d'action de validation.

MongoDB propose deux méthodes pour valider votre schéma, la validation de document et la validation de schéma JSON. La validation de schéma JSON est la version étendue de la validation de document, alors commençons par la validation de document.

Validation des documents

La plupart des développeurs qui ont travaillé avec des bases de données relationnelles connaissent l'importance de la prévisibilité des modèles ou schémas de données. Par conséquent, MongoDB a introduit la validation de documents à partir de la version 3.2. Voyons comment ajouter des règles de validation dans les collections MongoDB.

Supposons que vous ayez une collection d'utilisateurs qui ont les types de documents suivants.

{
    "name": "Alex",
    "email": "[email protected]",
    "mobile": "123-456-7890"
} 

Et voici les validations que nous voulons vérifier lors de l'ajout de nouveaux documents dans la collection des utilisateurs :

  • les champs nom, e-mail sont obligatoires
  • les numéros de mobile doivent suivre une structure spécifique :xxx-xxx-xxxx

Pour ajouter cette validation, nous pouvons utiliser la construction "validator" lors de la création d'une nouvelle collection. Exécutez la requête suivante dans le shell Mongo,

db.createCollection("users", {
  validator: {
        $and: [
            {
                "name": {$type: "string", $exists: true}
            },
            {
                "mobile": {$type: "string", $regex: /^[0-9]{3}-[0-9]{3}-[0-9]{4}$/}
            },
            {
                "email": {$type: "string", $exists: true}
            }
        ]
    }
})

Vous devriez voir le résultat suivant :

{ "ok" : 1 }

Maintenant, si vous essayez d'ajouter un nouveau document sans suivre les règles de validation, mongo générera une erreur de validation. Essayez d'exécuter les requêtes d'insertion suivantes.

Requête :1

db.users.insert({
    "name": "akash"
})

Sortie :

WriteResult({
    "nInserted" : 0,
    "writeError" : {
        "code" : 121,
        "errmsg" : "Document failed validation"
    }
})

Requête :2

db.users.insert({
    "name": "akash",
    "email": "[email protected]",
    "mobile": "123-456-7890"
})

Sortie :

WriteResult({ "nInserted" : 1 })

Cependant, il existe certaines restrictions avec l'approche de validation de document, comme on peut ajouter n'importe quel nombre de nouvelles paires clé-valeur au document et l'insérer dans la collection. Cela ne peut pas être empêché par la validation du document. Prenons l'exemple suivant,

db.users.insert({
    "name": "akash",
    "email": "[email protected]",
    "mobile": "123-456-7890",
    "gender": "Male"
})

Sortie :

WriteResult({ "nInserted" : 1 })

En dehors de cela, la validation du document ne vérifie que les valeurs. Supposons que si vous essayez d'ajouter le document avec "nmae" (faute de frappe) comme clé au lieu de "nom", mongo le considérera comme un nouveau champ et le document sera inséré dans la base de données. Ces choses doivent être évitées lorsque vous travaillez avec la base de données de production. Pour supporter tout cela, MongoDB a introduit l'opérateur "jsonSchema" avec la construction "validator" à partir de la version 3.6. Voyons comment ajouter les mêmes règles de validation que ci-dessus et éviter d'ajouter des champs nouveaux/mal orthographiés.

Plusieursnines Devenez un administrateur de base de données MongoDB – Amener MongoDB en productionDécouvrez ce que vous devez savoir pour déployer, surveiller, gérer et faire évoluer MongoDBDélécharger gratuitement

Validation jsonSchema

Exécutez la commande suivante dans mongo shell pour ajouter les règles de validation à l'aide de l'opérateur "jsonSchema".

db.runCommand(
  {
    "collMod": "users_temp",
    "validator": {
      "$jsonSchema": {
        "bsonType": "object",
        "additionalProperties": false,
        "required": [
          "name",
          "email"
        ],
        "properties": {
          "_id": {},
          "name": {
            "bsonType": "string"
          },
          "email": {
            "bsonType": "string"
          },
          "mobile": {
            "bsonType": "string",
            "pattern": "^[0-9]{3}-[0-9]{3}-[0-9]{4}$"
          }
        }
      }
    }
  })

Voyons maintenant ce qui se passe lorsque nous essayons d'insérer le document suivant.

db.users.insert({
    "name": "akash",
    "email": "[email protected]",
    "mobile": "123-456-7890",
    "gender": "Male"
})

Cela générera une erreur car nous n'avons pas défini de champ de genre dans le "jsonSchema".

WriteResult({
    "nInserted" : 0,
    "writeError" : {
        "code" : 121,
        "errmsg" : "Document failed validation"
    }
})

De la même manière, si vous avez des fautes de frappe dans les noms de champs, mongo lancera la même erreur.

Le schéma défini ci-dessus est le même que celui que nous avons utilisé en validation de document. De plus, nous avons ajouté le champ "additionalProperties" pour éviter les fautes de frappe dans les noms de champs et l'ajout de nouveaux champs dans les documents. Il n'autorisera que les champs définis dans le champ "propriétés". Voici l'aperçu de quelques propriétés que nous pouvons utiliser sous l'opérateur "jsonSchema".

  • bsonType :tableau | objet | chaîne | booléen | nombre | nul
  • required :un tableau de tous les champs obligatoires
  • enum :un tableau des seules valeurs possibles pour n'importe quel champ
  • minimum :valeur minimale du champ
  • maximum :valeur maximale du champ
  • minLength :longueur minimale du champ
  • mixLength :longueur maximale du champ
  • propriétés :une collection de schémas JSON valides
  • additionalProperties :nous empêche d'ajouter d'autres champs que ceux mentionnés dans le champ des propriétés
  • titre :titre de n'importe quel champ.
  • description :courte description de n'importe quel champ.

Outre la validation du schéma, l'opérateur "jsonSchema" peut également être utilisé dans l'étape de recherche et de correspondance à l'intérieur du pipeline d'agrégation.

Conclusion

Les validations de document/schéma ne sont pas requises ou souhaitables dans toutes les situations, mais en général, il est recommandé de les ajouter à votre base de données car cela augmentera la productivité des développeurs qui traitent avec votre base de données. Ils sauront à quel type de réponse s'attendre de la part de la base de données puisqu'il n'y aura pas de données aléatoires.

Dans cet article, nous avons appris l'importance de la validation de schéma dans MongoDB et comment ajouter des validations au niveau du document à l'aide de la validation de document et de l'opérateur "jsonSchema".