sql >> Databáze >  >> NoSQL >> MongoDB

Přidejte nový validátor do existující kolekce

Pravděpodobně bych to ve vaší otázce "měl" předřadit jednou mylnou představou. Faktem je, že MongoDB se liší od tradičních RDBMS v tom, že je „bez schématu“ a ve skutečnosti vůbec nepotřebujete „vytvářet pole“. To se tedy liší od "tabulkového schématu", kde nemůžete nic dělat, dokud se schéma nezmění. "Validace" je však jiná věc, stejně jako "stále" relativně nová funkce v době psaní.

Pokud chcete "přidat ověřovací pravidlo" pak existují metody, které závisí na aktuálním stavu kolekce. V obou případech ve skutečnosti neexistuje žádná funkce „přidat do“, ale akce je „nahradit“ vše ověřovací pravidla s novými, která je třeba specifikovat. Přečtěte si pravidla, jak to funguje.

Stávající dokumenty

Pokud má sbírka existující dokumenty, jak je uvedeno v dokumentaci

Stávající dokumenty

Pomocí validationLevel můžete ovládat, jak MongoDB nakládá se stávajícími dokumenty možnost.

Ve výchozím nastavení validationLevel je přísné a MongoDB aplikuje ověřovací pravidla na všechny vložky a aktualizace. Nastavení validationLevel moderovat aplikuje ověřovací pravidla na přílohy a aktualizace existujících dokumentů, které splňují ověřovací kritéria. S střední úrovně, aktualizace stávajících dokumentů, které nesplňují ověřovací kritéria, nejsou kontrolovány na platnost.

Tato a následující ukázková část v podstatě říká, že kromě možností na .createCollection() můžete také upravit existující sbírku s dokumenty, ale měli byste být "opatrní", že současné dokumenty nemusí splňovat požadovaná pravidla. Použijte proto "umírněný" pokud si nejste jisti, že pravidlo bude splněno pro všechny dokumentů ve sbírce.

Chcete-li použít, použijte .runCommand() způsob v současné době vydávat „příkaz“, který nastavuje pravidla ověřování. Což je "validationLevel" z pasáže výše.

Protože máte existující pravidla, můžeme je načíst pomocí `.getCollectionInfos() a poté přidat nové pravidlo a použít:

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

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

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

Samozřejmě, jak již bylo uvedeno výše, pokud jste si jisti, že všechny dokumenty splňují podmínky, můžete použít "přísné" místo toho jako výchozí.

Vyprázdnit sbírku

Pokud v tomto případě je sbírka skutečně "prázdná" a vůbec žádné dokumenty nebo můžete kolekci „vypustit“, protože aktuální data nejsou důležitá, pak můžete výše uvedené jednoduše změnit a použít .createCollection() v kombinaci s .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 });


  1. Co bych měl používat? Pokoje Socket.io nebo Redis pub-sub?

  2. Jak odebrat pole z dokumentu MongoDB ($unset)

  3. Dotazování dat z MongoDB pomocí GraphQL v Django:Get-Go (1)

  4. Redis jako mezipaměť druhé úrovně Hibernate