MongoDB proporciona la capacidad de realizar la validación del esquema durante las actualizaciones y las inserciones.
Las reglas de validación se basan en cada colección.
Para especificar reglas de validación al crear una nueva colección, úsela db.createCollection()
con la validator
opción.
Para agregar validación de documentos a una colección existente, use el collMod
comando con la validator
opción.
MongoDB también proporciona las siguientes opciones relacionadas:
validationLevel
opción, que determina qué tan estrictamente aplica MongoDB las reglas de validación a los documentos existentes durante una actualización, yvalidationAction
, que determina si MongoDB debeerror
rechazar y rechazar los documentos que violan las reglas de validación owarn
sobre las violaciones en el registro pero permiten documentos no válidos.
Nuevo en la versión 3.6 .
A partir de la versión 3.6, MongoDB admite la validación de esquemas JSON. Para especificar la validación del esquema JSON, use el $jsonSchema
operador en su validator
expresión.NOTA
JSON Schema es el medio recomendado para realizar la validación del esquema.
Por ejemplo, el siguiente ejemplo especifica las reglas de validación mediante el esquema JSON:
db.createCollection("students", {
validator: {
$jsonSchema: {
bsonType: "object",
required: [ "name", "year", "major", "address" ],
properties: {
name: {
bsonType: "string",
description: "must be a string and is required"
},
year: {
bsonType: "int",
minimum: 2017,
maximum: 3017,
description: "must be an integer in [ 2017, 3017 ] and is required"
},
major: {
enum: [ "Math", "English", "Computer Science", "History", null ],
description: "can only be one of the enum values and is required"
},
gpa: {
bsonType: [ "double" ],
description: "must be a double if the field exists"
},
address: {
bsonType: "object",
required: [ "city" ],
properties: {
street: {
bsonType: "string",
description: "must be a string if the field exists"
},
city: {
bsonType: "string",
description: "must be a string and is required"
}
}
}
}
}
}
})
Para obtener más información, consulte $jsonSchema
.
Además de la validación del esquema JSON que utiliza el $jsonSchema
operador de consulta, MongoDB admite la validación con otros operadores de consulta , con la excepción de:
Por ejemplo, el siguiente ejemplo especifica las reglas del validador mediante la expresión de consulta:
db.createCollection( "contacts",
{ validator: { $or:
[
{ phone: { $type: "string" } },
{ email: { $regex: /@mongodb\.com$/ } },
{ status: { $in: [ "Unknown", "Incomplete" ] } }
]
}
} )
CONSEJO
La validación se produce durante las actualizaciones y las inserciones. Cuando agrega validación a una colección, los documentos existentes no se someten a controles de validación hasta que se modifican.
La validationLevel
opción determina qué operaciones MongoDB aplica las reglas de validación:
- Si
validationLevel
esstrict
(el valor predeterminado), MongoDB aplica reglas de validación a todas las inserciones y actualizaciones. - Si
validationLevel
es asímoderate
, MongoDB aplica reglas de validación a inserciones y actualizaciones de documentos existentes que ya cumplen con los criterios de validación. Con elmoderate
nivel, no se comprueba la validez de las actualizaciones de los documentos existentes que no cumplen los criterios de validación.
Por ejemplo, cree una contacts
colección con los siguientes documentos:
db.contacts.insert([
{ "_id": 1, "name": "Anne", "phone": "+1 555 123 456", "city": "London", "status": "Complete" },
{ "_id": 2, "name": "Ivan", "city": "Vancouver" }
])
Emita el siguiente comando para agregar un validador a la contacts
colección:
db.runCommand( {
collMod: "contacts",
validator: { $jsonSchema: {
bsonType: "object",
required: [ "phone", "name" ],
properties: {
phone: {
bsonType: "string",
description: "must be a string and is required"
},
name: {
bsonType: "string",
description: "must be a string and is required"
}
}
} },
validationLevel: "moderate"
} )
La contacts
colección ahora tiene un validador con moderate
validationLevel:
- Si intentó actualizar el documento con
_id
de1
, MongoDB aplicaría las reglas de validación ya que el documento existente coincide con los criterios. - Por el contrario, MongoDB no se aplicará reglas de validación a las actualizaciones al documento con el
_id
del2
ya que no cumple con las reglas de validación.
Para desactivar la validación del todo, se puede establecer validationLevel
a off
.
La validationAction
opción determina cómo MongoDB maneja los documentos que violan las reglas de validación:
- Si
validationAction
eserror
(el valor predeterminado), MongoDB rechaza cualquier inserción o actualización que viole los criterios de validación. - Si
validationAction
es asíwarn
, MongoDB registra cualquier infracción pero permite que continúe la inserción o actualización.
Por ejemplo, cree una contacts2
colección con el siguiente validador de esquema JSON:
db.createCollection( "contacts2", {
validator: { $jsonSchema: {
bsonType: "object",
required: [ "phone" ],
properties: {
phone: {
bsonType: "string",
description: "must be a string and is required"
},
email: {
bsonType : "string",
pattern : "@mongodb\.com$",
description: "must be a string and match the regular expression pattern"
},
status: {
enum: [ "Unknown", "Incomplete" ],
description: "can only be one of the enum values"
}
}
} },
validationAction: "warn"
} )
Con el warn
validationAction
, MongoDB registra cualquier infracción, pero permite que continúe la inserción o actualización.
Por ejemplo, la siguiente operación de inserción viola la regla de validación:
db.contacts2.insert( { name: "Amanda", status: "Updated" } )
Sin embargo, dado que validationAction
es warn
solo, MongoDB solo registra el mensaje de violación de validación y permite que la operación continúe:
2017-12-01T12:31:23.738-05:00 W STORAGE [conn1] Document would fail validation collection: example.contacts2 doc: { _id: ObjectId('5a2191ebacbbfc2bdc4dcffc'), name: "Amanda", status: "Updated" }
No se puede especificar un validador para las colecciones en las admin
, local
y config
las bases de datos.
No puede especificar un validador para system.*
colecciones.
Los usuarios pueden omitir la validación de documentos usando la bypassDocumentValidation
opción.
Los siguientes comandos pueden omitir la validación por operación usando la nueva opción bypassDocumentValidation
:
applyOps
mandofindAndModify
comando ydb.collection.findAndModify()
métodomapReduce
comando ydb.collection.mapReduce()
métodoinsert
mandoupdate
mando$out
y$merge
etapas para elaggregate
comando y eldb.collection.aggregate()
método
Para las implementaciones que han habilitado el control de acceso, para evitar la validación de documentos, el usuario autenticado debe tener bypassDocumentValidation
acción. Los roles incorporados dbAdmin
y restore
proporcionan esta acción.