Depois de adicionar a validação do esquema a uma coleta, você pode modificar as regras de validação a qualquer momento. Por exemplo, você pode decidir:
Esses documentos em uma collection
usersnão exigem mais um endereço de e-mail.Para aumentar o comprimento mínimo de um campo
passwordde 8 caracteres para 12.
Para modificar a validação do esquema de uma coleta, use o comando collMod e especifique a validação atualizada no objeto validator.
Sobre esta tarefa
Você pode modificar a maioria dos componentes de uma validação de esquema, incluindo suas regras, nível de validação e ação de validação.
Observação
Se você definir seu nível de validação como constraint, não poderá modificar as regras de validação de esquema diretamente. Para alterar suas regras de validação, faça o downgrade para strict, modifique as regras e, em seguida, faça o upgrade de volta para constraint. Para obter mais informações sobre este procedimento, consulte Especificar Validação de restrição.
Se você atualizar as regras de validação de uma coleção, os documentos inseridos antes da alteração de validação podem não ser mais válidos. O MongoDB lida com esses documentos inválidos preexistentes de forma diferente, dependendo do seu validationLevel.
Nos níveis strict e moderate, o MongoDB aplica verificações de validação ao inserir ou atualizar um documento, mas não valida retroativamente documentos já existentes na coleção. Um atualizar para um documento já inválido falha, mesmo que o atualizar em si não introduza a violação.
No nível constraint, o MongoDB valida toda a coleção quando você faz upgrade para esse nível. Se você fizer o downgrade para strict, modificar as regras e, em seguida, fizer o upgrade de volta para constraint, o upgrade falhará se algum documento não corresponder às novas regras.
Passos
O procedimento a seguir cria uma coleta com regras de validação e modifica essas regras.
Crie uma coleta com validação.
Crie uma collection users com regras de validação:
db.createCollection("users", { validator: { $jsonSchema: { bsonType: "object", required: [ "username", "password" ], properties: { username: { bsonType: "string", description: "must be a string and is required" }, password: { bsonType: "string", minLength: 8, description: "must be a string at least 8 characters long, and is required" } } } } } )
Modifique o esquema de validação.
Execute o seguinte comando collMod para alterar o minLength do campo password de 8 para 12:
db.runCommand( { collMod: "users", validator: { $jsonSchema: { bsonType: "object", required: [ "username", "password" ], properties: { username: { bsonType: "string", description: "must be a string and is required" }, password: { bsonType: "string", minLength: 12, description: "must be a string of at least 12 characters, and is required" } } } } } )
Dica
Você também pode utilizar o comando collMod para adicionar validação a uma collection existente que não foi criada com validação.
Resultados
As seções a seguir mostram os resultados da validação atualizada nestes cenários:
Ao inserir um documento inválido.
Ao inserir um documento válido.
Quando um documento válido anteriormente se torna inválido devido às alterações da regra de validação.
Inserir um documento inválido
A operação a seguir tenta inserir um documento inválido. O documento é inválido porque o campo password tem 10 caracteres quando o comprimento mínimo é 12:
db.users.insertOne( { "username": "salesAdmin01", "password": "kT9$j4wg#M" } )
O MongoDB retorna o seguinte erro:
MongoServerError: Document failed validation Additional information: { failingDocumentId: ObjectId("62be0adb73c105dde9231299"), details: { operatorName: '$jsonSchema', schemaRulesNotSatisfied: [ { operatorName: 'properties', propertiesNotSatisfied: [ { propertyName: 'password', description: 'must be a string of at least 8 characters, and is required', details: [ { operatorName: 'minLength', specifiedAs: { minLength: 12 }, reason: 'specified string length was not satisfied', consideredValue: 'kT9$j4wg#M' } ] } ] } ] } }
Inserir um documento válido
A operação a seguir insere um documento válido, onde o campo password tem pelo menos 12 caracteres:
db.users.insertOne( { "username": "salesAdmin01", "password": "8p&SQd7T90$KKx" } )
Lidar com um documento anteriormente válido que não é mais válido
Considere o seguinte documento válido para a primeira versão da validação do esquema, mas não para o segundo:
db.users.insertOne( { "username": "salesAdmin02", "password": "i8U60*VyL8" } )
O campo password do documento tem 10 caracteres. A primeira versão da validação do esquema exigia um mínimo de 8 caracteres, o que significa que este documento era válido. No entanto, após atualizar a validação para exigir que o password tenha no mínimo 12 caracteres, o documento não é mais válido.
Quando uma alteração na validação de esquema faz com que documentos anteriormente válidos se tornem inválidos, os documentos recém-inválidos permanecem na coleta.
A maneira como o MongoDB lida com documentos recentemente inválidos depende do validationLevel do esquema. A validação do esquema neste exemplo usa o padrão validationLevel de strict, o que significa que o documento deve corresponder às novas regras de validação. O MongoDB verifica a validação cada vez que o documento é atualizado.
Se a validação do esquema atualizada tivesse um validationLevel de moderate, este documento não precisaria corresponder às novas regras de validação.