"Трябва" вероятно да добавя това с едно погрешно схващане във вашия въпрос. Факт е, че MongoDB се различава от традиционните RDBMS по това, че е "безсхемен" и всъщност изобщо не е необходимо да "създавате полета". Така че това се различава от "схема на таблица", където не можете да правите нищо, докато схемата не се промени. „Валидирането“ обаче е различно нещо, както и „все още“ сравнително нова функция към момента на писането.
Ако искате да "добавите правило за валидиране" тогава има методи, които зависят от текущото състояние на колекцията. И в двата случая всъщност няма функция „добавяне към“, но вместо това действието е „замяна“ на всички правилата за валидиране с нови за уточняване. Прочетете за правилата как работи това.
Съществуващи документи
Когато колекцията има съществуващи документи, както е отбелязано в документацията
Съществуващи документи
Можете да контролирате как MongoDB обработва съществуващи документи, като използвате validationLevel опция.
По подразбиране validationLevel е строго и MongoDB прилага правила за валидиране към всички вмъквания и актуализации. Задаване на validationLevel доумерено прилага правила за валидиране към вмъквания и актуализации на съществуващи документи, които отговарят на критериите за валидиране. Сумереното ниво, актуализациите на съществуващи документи, които не отговарят на критериите за валидиране, не се проверяват за валидност.
Този и следващия примерен раздел по същество казват, че в допълнение към опциите на .createCollection()
можете също да модифицирате съществуваща колекция с документи, но трябва да внимавате, че настоящите документи може да не отговарят на изискваните правила. Затова използвайте "умерено" ако не сте сигурни, че правилото ще бъде спазено за всички документи в колекцията.
За да кандидатствате, използвате .runCommand()
метод в момента за издаване на "командата", която задава правилата за валидиране. Което е "validationLevel" от пасажа по-горе.
Тъй като имате съществуващи правила, можем да използваме `.getCollectionInfos(), за да ги извлечем и след това да добавим новото правило и да го приложим:
let validatior = db.getCollectionInfos({name: "MyTestCollection"})[0].options.validator;
validator.$or.push({ "LastLoginDate": { "$type": "date" } });
db.runCommand({
"collMod": "MyTestCollection",
"validator": validator,
"validationLevel": "moderate"
});
Разбира се, както беше отбелязано по-горе, че ако сте уверени, че всички документи отговарят на условията, тогава можете да кандидатствате „стриктно“ вместо това по подразбиране.
Празна колекция
Ако в случая е, че колекцията действително е "празна" без никакви документи въобще или можете да "изпуснете" колекцията, тъй като текущите данни не са от значение, тогава можете просто да промените горното и да използвате .createCollection()
в комбинация с .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 });