MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Adicionar novo validador à coleção existente


Eu "deveria" provavelmente prefixar isso com um equívoco em sua pergunta. O fato é que o MongoDB difere do RDBMS tradicional por ser "sem esquema" e na verdade você não precisa "criar campos". Portanto, isso difere de um "esquema de tabela" em que você não pode fazer nada até que o esquema seja alterado. "Validação", no entanto, é uma coisa diferente, bem como um recurso "ainda" relativamente novo no momento da escrita.

Se você deseja "adicionar uma regra de validação" então existem métodos que dependem do estado atual da coleção. Em ambos os casos, na verdade não há função "adicionar a", mas a ação é "substituir" todos as regras de validação com novas para especificar. Leia sobre as regras de como isso funciona.

Documentos existentes


Onde a coleção possui documentos existentes, conforme observado na documentação

Documentos existentes

Você pode controlar como o MongoDB lida com documentos existentes usando o validationLevel opção.

Por padrão, validationLevel é estrito e o MongoDB aplica regras de validação a todas as inserções e atualizações. Configurando validationLevel para moderar aplica regras de validação a inserções e atualizações de documentos existentes que atendem aos critérios de validação. Com o moderado nível, as atualizações de documentos existentes que não atendem aos critérios de validação não são verificadas quanto à validade.

Esta e a seção de exemplo a seguir estão basicamente dizendo que, além das opções em .createCollection() você também pode modificar uma coleção existente com documentos, mas deve estar "cauteloso" para que os presentes documentos não atendam às regras exigidas. Portanto, use "moderado" se você não tiver certeza de que a regra será cumprida para todos documentos da coleção.

Para aplicar, você usa o .runCommand() no momento para emitir o "comando" que define as regras de validação. Qual é "validationLevel" da passagem acima.

Como você tem regras existentes, podemos usar `.getCollectionInfos() para recuperá-las e então adicionar a nova regra e aplicar:
let validatior = db.getCollectionInfos({name: "MyTestCollection"})[0].options.validator;

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

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

É claro que, como observado anteriormente, se você tiver certeza de que todos os documentos atendem às condições, poderá aplicar "estrito" como o padrão em vez disso.

Coleção vazia


Se, no caso, a coleção estiver realmente "vazia" sem nenhum documento ou você pode "descartar" a coleção já que os dados atuais não são importantes, então você pode simplesmente variar o acima e usar .createCollection() em combinação com .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 });