Menu Docs
Página inicial do Docs
/
Manual do banco de dados
/ /

Consultar e modificar documentos válidos ou inválidos

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.

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 }
] )

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:

    • item deve ser tipo JSON string.

    • qty deve ser tipo JSON integer.

    • instock deve ser tipo JSON boolean.

  • size, se presente:

    • Deve ser tipo JSON object.

    • Deve incluir unit como um campo string obrigatório.

    • Se os campos h e w incorporados estiverem presentes, eles deverão ser do tipo double.

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
}
]

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
}
]

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
}
]

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
}
]

Voltar

Modificar regras

Nesta página