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.
Ejemplos
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 } ] )
Definir un objeto de esquema
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:
itemdebe ser de tipo BSONstring.qtydebe ser de tipo BSONinteger.instockdebe ser de tipo BSONboolean.
size, si está presente:Debe ser de tipo BSON
object.Debe incluir
unitcomo campo obligatoriostring.Si los campos
hywincrustados están presentes, deben ser de tipodouble.
Buscar documentos que coincidan con el esquema
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 } ]
Encontrar documentos que no coinciden con el esquema
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 } ]
Actualizar documentos que no coinciden con el esquema
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 } ]
Eliminar documentos que no coinciden con el esquema
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 } ]