Schema Validation
New in version 3.2.
MongoDB provides the capability to perform schema validation duringupdates and insertions.
Specify Validation Rules
Validation rules are on a per-collection basis.
To specify validation rules when creating a new collection, usedb.createCollection()
with the validator
option.
To add document validation to an existing collection, usecollMod
command with the validator
option.
MongoDB also provides the following related options:
validationLevel
option, which determines how strictly MongoDBapplies validation rules to existing documents during an update, andvalidationAction
option, which determines whether MongoDB shoulderror
and reject documents that violate the validation rules orwarn
about the violations in the log but allow invalid documents.
JSON Schema
New in version 3.6.
Starting in version 3.6, MongoDB supports JSON Schema validation. Tospecify JSON Schema validation, use the $jsonSchema
operatorin your validator
expression.
Note
JSON Schema is the recommended means of performing schema validation.
For example, the following example specifies validation rules usingJSON schema:
- 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"
- }
- }
- }
- }
- }
- }
- })
For more information, see $jsonSchema
.
Other Query Expressions
In addition to JSON Schema validation that uses the$jsonSchema
query operator, MongoDB supportsvalidation with other query operators, with the exception of the $near
,$nearSphere
, $text
, and $where
operators.
For example, the following example specifies validator rules using thequery expression:
- db.createCollection( "contacts",
- { validator: { $or:
- [
- { phone: { $type: "string" } },
- { email: { $regex: /@mongodb\.com$/ } },
- { status: { $in: [ "Unknown", "Incomplete" ] } }
- ]
- }
- } )
See also
Behavior
Validation occurs during updates and inserts. When you add validation toa collection, existing documents do not undergo validation checks untilmodification.
Existing Documents
The validationLevel
option determines which operations MongoDBapplies the validation rules:
- If the
validationLevel
isstrict
(the default), MongoDBapplies validation rules to all inserts and updates. - If the
validationLevel
ismoderate
, MongoDB appliesvalidation rules to inserts and to updates to existing documents thatalready fulfill the validation criteria. With themoderate
level,updates to existing documents that do not fulfill the validationcriteria are not checked for validity.
For example, create a contacts
collection with the followingdocuments:
- db.contacts.insert([
- { "_id": 1, "name": "Anne", "phone": "+1 555 123 456", "city": "London", "status": "Complete" },
- { "_id": 2, "name": "Ivan", "city": "Vancouver" }
- ])
Issue the following command to add a validator to the contacts
collection:
- 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"
- } )
The contacts
collection now has a validator with the moderate
validationLevel:
- If you attempted to update the document with
_id
of1
,MongoDB would apply the validation rules since the existing documentmatches the criteria. - In contrast, MongoDB will not apply validation rules to updates tothe document with
_id
of2
as it does not meet thevalidation rules.
To disable validation entirely, you can set validationLevel
tooff
.
Accept or Reject Invalid Documents
The validationAction
option determines how MongoDB handlesdocuments that violate the validation rules:
- If the
validationAction
iserror
(the default), MongoDBrejects any insert or update that violates the validation criteria. - If the
validationAction
iswarn
, MongoDB logs any violationsbut allows the insertion or update to proceed.
For example, create a contacts2
collection with the following JSONSchema validator:
- 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"
- } )
With the warn
validationAction
, MongoDB logs anyviolations but allows the insertion or update to proceed.
For example, the following insert operation violates the validation rule:
- db.contacts2.insert( { name: "Amanda", status: "Updated" } )
However, since the validationAction
is warn
only, MongoDB onlylogs the validation violation message and allows the operation toproceed:
- 2017-12-01T12:31:23.738-0500 W STORAGE [conn1] Document would fail validation collection: example.contacts2 doc: { _id: ObjectId('5a2191ebacbbfc2bdc4dcffc'), name: "Amanda", status: "Updated" }
Restrictions
You cannot specify a validator for collections in the admin
,local
, and config
databases.
You cannot specify a validator for system.*
collections.
Bypass Document Validation
Users can bypass document validation using thebypassDocumentValidation
option.
The following commands can bypass validation per operation using thenew option bypassDocumentValidation
:
applyOps
commandfindAndModify
command anddb.collection.findAndModify()
methodmapReduce
command anddb.collection.mapReduce()
methodinsert
commandupdate
command$out
and$merge
stages for theaggregate
command anddb.collection.aggregate()
method
For deployments that have enabled access control, to bypass documentvalidation, the authenticated user must havebypassDocumentValidation
action. The built-in rolesdbAdmin
and restore
provide this action.
Additional Information
See also