Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

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

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.

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 }
] )

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:

    • item debe ser del tipo BSON string.

    • qty debe ser del tipo BSON integer.

    • instock debe ser del tipo BSON boolean.

  • size, si está presente:

    • Debe ser de tipo BSON object.

    • Debe incluir unit como un campo string obligatorio.

    • Si los campos incrustados h y w 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 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
}
]

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

Volver

Modificar las reglas

En esta página