Ignorar validação de esquema
Em algumas situações, talvez seja necessário ignorar as regras de validação do esquema de uma coleção. Por exemplo, se você estiver restaurando dados potencialmente inválidos de uma cópia de segurança para uma coleção que tem regras de validação. Nesse cenário, documentos antigos podem não atender aos novos requisitos de validação.
Contexto
Ignorar a validação do esquema é feito por operação. Se você ignorar a validação do esquema para inserir um documento inválido, qualquer atualização futura no documento inválido deverá:
Ignore também a validação do esquema
Resultado em um documento válido
Operações suportadas
Você pode usar os seguintes comandos e métodos para ignorar a validação por operação:
applyOps
comandoComando
findAndModify
e métododb.collection.findAndModify()
Comando
mapReduce
e métododb.collection.mapReduce()
insert
comandoupdate
comando$out
e$merge
estágios para o comandoaggregate
e o métododb.collection.aggregate()
Pré-requisitos
Para sistemas que habilitaram o controle de acesso, para ignorar a validação do documento, o usuário autenticado deve ter a açãobypassDocumentValidation
. Os papéis embutidos dbAdmin
e restore
fornecem esta ação.
Passos
O exemplo a seguir cria uma coleção com validação de esquema e, em seguida, insere um documento inválido ignorando as regras de validação.
Crie uma coleção com regras de validação
Crie uma coleção students
e use o operador $jsonSchema
para definir regras de validação de esquema:
db.createCollection("students", { validator: { $jsonSchema: { bsonType: "object", required: [ "name", "year", "major", "address" ], properties: { name: { bsonType: "string", description: "must be a string and is required" }, year: { bsonType: "int", minimum: 2017, maximum: 3017, description: "must be an integer in [ 2017, 3017 ] and is required" } } } } } )
Ignorar a validação para inserir um documento inválido
O seguinte documento é inválido porque o campo year
está fora dos limites permitidos (2017
-3017
):
{ name: "Alice", year: Int32( 2016 ), major: "History", gpa: Double(3.0), address: { city: "NYC", street: "33rd Street" } }
Para ignorar as regras de validação e inserir o documento inválido, execute o seguinte comando insert
, que define a opção bypassDocumentValidation
como true
:
db.runCommand( { insert: "students", documents: [ { name: "Alice", year: Int32( 2016 ), major: "History", gpa: Double(3.0), address: { city: "NYC", street: "33rd Street" } } ], bypassDocumentValidation: true } )
Resultados
Para confirmar que o documento foi inserido com sucesso, consulte a coleção students
:
db.students.find()
O MongoDB retorna o documento inserido:
[ { _id: ObjectId("62bcb4db3f7991ea4fc6830e"), name: 'Alice', year: 2016, major: 'History', gpa: 3, address: { city: 'NYC', street: '33rd Street' } } ]