Si añades validación a tu colección después de crearla, o modificas un esquema de validación existente, es probable que haya documentos no válidos en tu colección. Del mismo modo, si el validationAction de tu esquema es warn, tu colección puede contener documentos no válidos. Puedes query para documentos no válidos para actualizar o eliminarlos de tu colección si es necesario.
Para encontrar documentos que coincidan o no con un esquema específico, utiliza $jsonSchema con operadores del query. De manera similar, puedes actualizar o eliminar documentos en función de un esquema utilizando $jsonSchema en las condiciones de query para las 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
Define un objeto de esquema de muestra y almacénalo 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 del tipo BSONstring.qtydebe ser del tipo BSONinteger.instockdebe ser del tipo BSONboolean.
size, si está presente:Debe ser de tipo BSON
object.Debe incluir
unitcomo un campostringobligatorio.Si los campos incrustados
hywestán presentes, deben ser de tipodouble.
Encuentra 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 } ]
Encuentra documentos que no coinciden con el esquema
Para encontrar documentos en una colección que no coincidan con las reglas de validación del esquema, utilice $jsonSchema con el operador $nor. Por 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 } ]
Borrar documentos que no coincidan con el esquema
Este comando borra 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 } ]