Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

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, 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.

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