Si añades validación a tu colección después de crearla, o modificas un esquema de validación existente, puede que tengas documentos no válidos en tu colección. Del mismo modo, si el esquema validationAction es warn, se permite que su colección contenga documentos no válidos. Puedes query documentos no válidos para potencialmente actualizarlos o eliminarlos de tu colección.
Para encontrar documentos que coincidan o no coincidan con un esquema especificado, utilizar $jsonSchema con operadores del query. De forma similar, puedes actualizar o borrar documentos basados en un esquema usando $jsonSchema en las condiciones de la query para operaciones de guardar.
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 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
hywincrustados está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 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 } ]