Docs Menu
Docs Home
/ /

Query para documentos y modificación de los que son válidos o no válidos

Si agrega validación a su colección después de crearla o modifica un esquema de validación existente, es posible que tenga documentos no válidos en su colección. De igual manera, si su esquema validationAction Si es warn, su colección puede contener documentos no válidos. Puede consultarlos para actualizarlos o eliminarlos de su colección.

Para buscar documentos que coincidan o no con un esquema específico, utilice $jsonSchema con operadores de consulta. De igual forma, puede actualizar o eliminar documentos según un esquema usando $jsonSchema en las condiciones de consulta para operaciones de escritura.

Cree una colección de muestra inventory con los siguientes 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 un objeto de esquema de muestra y almacénelo en una variable llamada 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" }
}
}
}

El esquema aplica la siguiente validación:

  • Campos obligatorios:

    • item debe ser de tipo BSON string.

    • qty debe ser de tipo BSON integer.

    • instock debe ser de tipo BSON boolean.

  • size, si está presente:

    • Debe ser de tipo BSON object.

    • Debe incluir unit como campo obligatorio string.

    • Si los campos h y w incrustados están presentes, deben ser de tipo double.

Estos comandos devuelven todos los documentos que coinciden con el esquema:

db.inventory.find(myschema)
db.inventory.aggregate( [ { $match: myschema } ] )

Ambos comandos devuelven el mismo resultado:

[
{
_id: ObjectId("62b5cd5a14b92d148400f7a3"),
item: 'apple',
qty: 45,
status: 'A',
instock: true
},
{
_id: ObjectId("62b5cd5a14b92d148400f7a4"),
item: 'pears',
qty: 50,
status: 'A',
instock: true
}
]

Para encontrar documentos en una colección que no cumplan con las reglas de validación del esquema, utilice $jsonSchema con el operador. Por $nor ejemplo:

db.inventory.find( { $nor: [ myschema ] } )

Salida:

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

Este comando actualiza todos los documentos que no coinciden con el esquema y establece el campo isValid de los documentos en false:

db.inventory.updateMany(
{
$nor: [ myschema ]
},
{
$set: { isValid: false }
}
)

Para verificar la actualización, consulta la colección:

db.inventory.find()

Salida:

[
{
_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 elimina todos los documentos que no coinciden con el esquema:

db.inventory.deleteMany( { $nor: [ myschema ] } )

Para verificar la actualización, consulta la colección:

db.inventory.find()

Salida:

[
{
_id: ObjectId("62b5cd5a14b92d148400f7a3"),
item: 'apple',
qty: 45,
status: 'A',
instock: true
},
{
_id: ObjectId("62b5cd5a14b92d148400f7a4"),
item: 'pears',
qty: 50,
status: 'A',
instock: true
}
]

Volver

Modificar las reglas

En esta página