Consultar e modificar documentos válidos ou inválidos
Nesta página
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: NumberInt(25), size: { h: 14, w: 21, uom: "cm" }, instock: true }, { item: "notebook", qty: NumberInt(50), size: { h: 8.5, w: 11, uom: "in" }, instock: true }, { item: "paper", qty: NumberInt(100), size: { h: 8.5, w: 11, uom: "in" }, instock: 1 }, { item: "planner", qty: NumberInt(75), size: { h: 22.85, w: 30, uom: "cm" }, instock: 1 }, { item: "postcard", qty: NumberInt(45), size: { h: 10, w: 15.25, uom: "cm" }, instock: true }, { item: "apple", qty: NumberInt(45), status: "A", instock: true }, { item: "pears", qty: NumberInt(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: [ "uom" ], properties: { uom: { bsonType: "string" }, h: { bsonType: "double" }, w: { bsonType: "double" } } }, instock: { bsonType: "bool" } } } }
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:
[ { _id: ObjectId("62b5cd5a14b92d148400f79e"), item: 'journal', qty: 25, size: { h: 14, w: 21, uom: 'cm' }, instock: true }, { _id: ObjectId("62b5cd5a14b92d148400f79f"), item: 'notebook', qty: 50, size: { h: 8.5, w: 11, uom: 'in' }, instock: true }, { _id: ObjectId("62b5cd5a14b92d148400f7a0"), item: 'paper', qty: 100, size: { h: 8.5, w: 11, uom: 'in' }, instock: 1 }, { _id: ObjectId("62b5cd5a14b92d148400f7a1"), item: 'planner', qty: 75, size: { h: 22.85, w: 30, uom: 'cm' }, instock: 1 }, { _id: ObjectId("62b5cd5a14b92d148400f7a2"), item: 'postcard', qty: 45, size: { h: 10, w: 15.25, uom: 'cm' }, instock: true } ]
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, uom: 'cm' }, instock: true, isValid: false }, { _id: ObjectId("62b5cd5a14b92d148400f79f"), item: 'notebook', qty: 50, size: { h: 8.5, w: 11, uom: 'in' }, instock: true, isValid: false }, { _id: ObjectId("62b5cd5a14b92d148400f7a0"), item: 'paper', qty: 100, size: { h: 8.5, w: 11, uom: 'in' }, instock: 1, isValid: false }, { _id: ObjectId("62b5cd5a14b92d148400f7a1"), item: 'planner', qty: 75, size: { h: 22.85, w: 30, uom: 'cm' }, instock: 1, isValid: false }, { _id: ObjectId("62b5cd5a14b92d148400f7a2"), item: 'postcard', qty: 45, size: { h: 10, w: 15.25, uom: 'cm' }, instock: true, 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 } ]