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: 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 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: [ "uom" ], properties: { uom: { bsonType: "string" }, h: { bsonType: "double" }, w: { bsonType: "double" } } }, instock: { bsonType: "bool" } } } }
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:
[ { _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 } ]
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, 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 } ]
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 } ]