Se você adicionar validação à sua collection após criá-la ou modificar um esquema de validação existente, poderá ter documento inválidos na sua collection. Da mesma forma, se o validationAction do seu esquema for warn, sua collection poderá conter documento inválidos. Você pode fazer query de documento inválidos para potencialmente atualizá-los ou excluí-los da sua collection.
Para localizar documentos que correspondam ou não a um esquema especificado, use $jsonSchema com operadores de query. Da mesma forma, você pode atualizar ou excluir documentos com base em um esquema usando $jsonSchema em condições de query para operações de gravação.
Exemplos
Criar uma collection de amostra inventory com os seguintes documentos:
db.inventory.insertMany( [ { item: "journal", qty: 25, size: { h: 14, w: 21, unit: "cm" }, instock: true }, { item: "notebook", qty: 50, size: { h: 8.5, w: 11, unit: "in" }, instock: true }, { item: "paper", qty: 100, size: { h: 8.5, w: 11, unit: "in" }, instock: 1 }, { item: "apple", qty: 45, status: "A", instock: true }, { item: "pears", qty: 50, status: "A", instock: true } ] )
Definir um objeto de esquema
Defina um objeto de esquema de amostra e armazene-o em uma variável chamada myschema:
let myschema = { $jsonSchema: { required: [ "item", "qty", "instock" ], properties: { item: { bsonType: "string" }, qty: { bsonType: "int" }, size: { bsonType: "object", required: [ "unit" ], properties: { unit: { bsonType: "string" }, h: { bsonType: "double" }, w: { bsonType: "double" } } }, instock: { bsonType: "bool" } } } }
O esquema força a seguinte validação:
Campos obrigatórios:
itemdeve ser tipo JSONstring.qtydeve ser tipo JSONinteger.instockdeve ser tipo JSONboolean.
size, se presente:Deve ser tipo JSON
object.Deve incluir
unitcomo um campostringobrigatório.Se os campos
hewincorporados estiverem presentes, eles deverão ser do tipodouble.
Encontrar documentos que correspondam ao esquema
Estes comandos retornam todos os documentos que correspondem ao esquema:
db.inventory.find(myschema) db.inventory.aggregate( [ { $match: myschema } ] )
Ambos os comandos retornam o mesmo resultado:
[ { _id: ObjectId("62b5cd5a14b92d148400f7a3"), item: 'apple', qty: 45, status: 'A', instock: true }, { _id: ObjectId("62b5cd5a14b92d148400f7a4"), item: 'pears', qty: 50, status: 'A', instock: true } ]
Encontrar documentos que não correspondem ao esquema
Para localizar documentos em uma coleção que não correspondam às regras de validação do esquema, use $jsonSchema com o operador $nor. Por exemplo:
db.inventory.find( { $nor: [ myschema ] } )
Saída:
[ // Neither size.h nor size.w are type double { _id: ObjectId("62b5cd5a14b92d148400f79e"), item: 'journal', qty: 25, size: { h: 14, w: 21, unit: 'cm' }, instock: true }, // size.w is not a double { _id: ObjectId("62b5cd5a14b92d148400f79f"), item: 'notebook', qty: 50, size: { h: 8.5, w: 11, unit: 'in' }, instock: true }, // size.w is not a double and instock is not a boolean { _id: ObjectId("62b5cd5a14b92d148400f7a0"), item: 'paper', qty: 100, size: { h: 8.5, w: 11, unit: 'in' }, instock: 1 } ]
Atualize os documentos que não correspondem ao esquema
Esse comando atualiza todos os documentos que não correspondem ao esquema e define o campo isValid dos documentos como false:
db.inventory.updateMany( { $nor: [ myschema ] }, { $set: { isValid: false } } )
Para verificar a atualização, faça a query da coleção:
db.inventory.find()
Saída:
[ { _id: ObjectId("62b5cd5a14b92d148400f79e"), item: 'journal', qty: 25, size: { h: 14, w: 21, unit: 'cm' }, instock: true, isValid: false }, { _id: ObjectId("62b5cd5a14b92d148400f79f"), item: 'notebook', qty: 50, size: { h: 8.5, w: 11, unit: 'in' }, instock: true, isValid: false }, { _id: ObjectId("62b5cd5a14b92d148400f7a0"), item: 'paper', qty: 100, size: { h: 8.5, w: 11, unit: 'in' }, instock: 1, isValid: false }, { _id: ObjectId("62b5cd5a14b92d148400f7a3"), item: 'apple', qty: 45, status: 'A', instock: true }, { _id: ObjectId("62b5cd5a14b92d148400f7a4"), item: 'pears', qty: 50, status: 'A', instock: true } ]
Excluir documentos que não correspondem ao esquema
Este comando exclui todos os documentos que não correspondem ao esquema:
db.inventory.deleteMany( { $nor: [ myschema ] } )
Para verificar a atualização, faça a query da coleção:
db.inventory.find()
Saída:
[ { _id: ObjectId("62b5cd5a14b92d148400f7a3"), item: 'apple', qty: 45, status: 'A', instock: true }, { _id: ObjectId("62b5cd5a14b92d148400f7a4"), item: 'pears', qty: 50, status: 'A', instock: true } ]