MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Aggiungi un nuovo validatore alla raccolta esistente

Probabilmente "dovrei" anteporre a questo un malinteso nella tua domanda. Il fatto è che MongoDB differisce dal tradizionale RDBMS in quanto è "senza schema" e in effetti non è affatto necessario "creare campi". Quindi questo è diverso da uno "schema di tabella" in cui non puoi fare nulla fino a quando lo schema non cambia. La "convalida" tuttavia è una cosa diversa, nonché una funzionalità "ancora" relativamente nuova al momento della scrittura.

Se desideri "aggiungere una regola di convalida" poi ci sono metodi che dipendono dallo stato attuale della raccolta. In entrambi i casi, in realtà non esiste una funzione "aggiungi a", ma l'azione è invece "sostituire" tutto le regole di validazione con quelle nuove da specificare. Continua a leggere per le regole di come funziona.

Documenti esistenti

Laddove la collezione abbia documenti esistenti, come indicato nella documentazione

Documenti esistenti

Puoi controllare il modo in cui MongoDB gestisce i documenti esistenti utilizzando il livello di convalida opzione.

Per impostazione predefinita, livello di convalida è rigoroso e MongoDB applica le regole di convalida a tutti gli inserti e gli aggiornamenti. Impostazione del livello di convalida per moderare applica le regole di convalida agli inserti e agli aggiornamenti ai documenti esistenti che soddisfano i criteri di convalida. Con i moderati livello, la validità degli aggiornamenti ai documenti esistenti che non soddisfano i criteri di convalida non viene verificata.

Questa e la seguente sezione di esempio stanno sostanzialmente dicendo che oltre alle opzioni su .createCollection() puoi anche modificare una collezione esistente con documenti, ma dovresti "diffidare" dal fatto che i presenti documenti potrebbero non soddisfare le regole richieste. Quindi usa "moderato" se non sei sicuro, la regola verrà soddisfatta per tutti documenti della collezione.

Per candidarti, usa .runCommand() metodo attuale per emettere il "comando" che fissa le regole di validazione. Che è "livello di convalida" dal passaggio sopra.

Poiché disponi di regole esistenti, possiamo utilizzare `.getCollectionInfos() per recuperarle, quindi aggiungere la nuova regola e applicare:

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

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

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

Ovviamente, come notato prima, se sei sicuro che tutti i documenti soddisfino le condizioni, puoi applicare "rigoroso" come predefinito invece.

Raccolta vuota

Se nel caso è che la collezione è effettivamente "vuota" senza alcun documento o puoi "eliminare" la raccolta poiché i dati correnti non sono rilevanti, quindi puoi semplicemente variare quanto sopra e utilizzare .createCollection() in combinazione con .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 });