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

Ajouter un nouveau validateur à la collection existante

Je "devrais" probablement préfixer cela avec une idée fausse dans votre question. Le fait est que MongoDB diffère du SGBDR traditionnel en ce sens qu'il est "sans schéma" et que vous n'avez en fait pas du tout besoin de "créer des champs". Cela diffère donc d'un "schéma de table" où vous ne pouvez rien faire tant que le schéma n'a pas changé. "Validation" est cependant une chose différente ainsi qu'une fonctionnalité "encore" relativement nouvelle au moment de l'écriture.

Si vous souhaitez "ajouter une règle de validation" puis il y a des méthodes qui dépendent de l'état actuel de la collection. Dans les deux cas, il n'y a pas de fonction "ajouter à", mais l'action consiste plutôt à "remplacer" tout les règles de validation avec de nouvelles à préciser. Lisez la suite pour connaître les règles de fonctionnement.

Documents existants

Où la collection a des documents existants, comme indiqué dans la documentation

Documents existants

Vous pouvez contrôler la façon dont MongoDB gère les documents existants à l'aide de validationLevel option.

Par défaut, validationLevel est strict et MongoDB applique des règles de validation à toutes les insertions et mises à jour. Définition de validationLevel à modérer applique des règles de validation aux insertions et aux mises à jour des documents existants qui répondent aux critères de validation. Avec le modéré niveau, les mises à jour des documents existants qui ne remplissent pas les critères de validation ne sont pas vérifiées pour leur validité.

Cette section et la section d'exemple suivante disent essentiellement qu'en plus des options sur .createCollection() vous pouvez également modifier une collection existante avec des documents, mais vous devez vous méfier du fait que les documents actuels ne respectent pas les règles requises. Utilisez donc "modéré" si vous n'êtes pas sûr que la règle sera respectée pour tous documents de la collection.

Pour postuler, vous utilisez le .runCommand() méthode à l'heure actuelle pour émettre la "commande" qui définit les règles de validation. Qui est "validationLevel" du passage ci-dessus.

Puisque vous avez des règles existantes, nous pouvons utiliser le `.getCollectionInfos() pour les récupérer, puis ajouter la nouvelle règle et l'appliquer :

let validatior = db.getCollectionInfos({name: "MyTestCollection"})[0].options.validator;

validator.$or.push({ "LastLoginDate": { "$type": "date" } });

db.runCommand({
  "collMod": "MyTestCollection",
  "validator": validator,
  "validationLevel": "moderate"
});

Bien sûr, comme indiqué précédemment, si vous êtes sûr que les documents remplissent tous les conditions, vous pouvez appliquer "strict" par défaut à la place.

Collection vide

Si dans le cas où la collection est en fait "vide" sans aucun document ou vous pouvez "supprimer" la collection puisque les données actuelles n'ont pas d'importance, alors vous pouvez simplement modifier ce qui précède et utiliser .createCollection() en combinaison avec .drop() :

let validatior = db.getCollectionInfos({name: "MyTestCollection"})[0].options.validator;

validator.$or.push({ "LastLoginDate": { "$type": "date" } });

db.getCollection("MyTestCollection").drop();

db.createCollection( "MyTestCollection", { "validator": validator });