Jag "borde" förmodligen prefixa detta med en missuppfattning i din fråga. Faktum är att MongoDB skiljer sig från traditionella RDBMS genom att det är "schemalöst" och att du faktiskt inte behöver "skapa fält" alls. Så detta skiljer sig från ett "tabellschema" där du inte kan göra något förrän schemat ändras. "Validering" är dock en annan sak och en "fortfarande" relativt ny funktion när det skrivs.
Om du vill "lägga till en valideringsregel" sedan finns det metoder som beror på det aktuella tillståndet i samlingen. I båda fallen finns det faktiskt ingen "lägg till"-funktion, utan åtgärden är istället att "ersätta" alla valideringsreglerna med nya att specificera. Läs vidare för reglerna för hur detta fungerar.
Befintliga dokument
Där samlingen har befintliga dokument, som anges i dokumentationen
Befintliga dokument
Du kan styra hur MongoDB hanterar befintliga dokument med valideringsnivån alternativ.
Som standard, validationLevel är strikt och MongoDB tillämpar valideringsregler på alla inlägg och uppdateringar. Ställa in valideringsnivå för att moderera tillämpar valideringsregler på bilagor och på uppdateringar av befintliga dokument som uppfyller valideringskriterierna. Med moderat nivå, uppdateringar av befintliga dokument som inte uppfyller valideringskriterierna kontrolleras inte för giltighet.
Detta och följande exempelavsnitt säger i princip att förutom alternativen på .createCollection()
du kan också modifiera en befintlig samling med dokument, men bör vara "aktsam" för att de aktuella dokumenten kanske inte uppfyller de regler som krävs. Använd därför "moderat" om du är osäker kommer regeln att uppfyllas för alla dokument i samlingen.
För att ansöka använder du .runCommand()
metod för att utfärda "kommandot" som anger valideringsreglerna. Vilket är "validationLevel" från avsnittet ovan.
Eftersom du har befintliga regler kan vi använda `.getCollectionInfos() för att hämta dem och sedan lägga till den nya regeln och tillämpa:
let validatior = db.getCollectionInfos({name: "MyTestCollection"})[0].options.validator;
validator.$or.push({ "LastLoginDate": { "$type": "date" } });
db.runCommand({
"collMod": "MyTestCollection",
"validator": validator,
"validationLevel": "moderate"
});
Naturligtvis som tidigare nämnt, att om du är säker på att alla dokument uppfyller villkoren kan du tillämpa "strikt" som standard istället.
Töm samling
Om i fallet är att samlingen faktiskt är "tom" utan några dokument alls eller du kan "släppa" insamlingen eftersom den aktuella informationen inte är av betydelse, då kan du helt enkelt variera ovanstående och använda .createCollection()
i kombination med .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 });