指定现有文档的验证级别
对于在添加验证之前集合中已经存在的文档,您可以指定MongoDB如何将验证规则应用于这些文档。
上下文
模式的 validationLevel
决定 MongoDB 应用验证规则的文档:
validationLevel | 行为 |
---|---|
strict | (默认) MongoDB对所有文档插入和更新应用相同的验证规则。 |
moderate | MongoDB将相同的验证规则应用于文档插入,并更新与验证规则匹配的现有有效文档。 对集合中现有文档的更新如果与验证规则不匹配,则无需通过验证。 |
先决条件
本页上的示例使用包含以下文档的contacts
集合:
db.contacts.insertMany([ { "_id": 1, "name": "Anne", "phone": "+1 555 123 456", "city": "London", "status": "Complete" }, { "_id": 2, "name": "Ivan", "city": "Vancouver" } ])
步骤:使用strict
验证
以下示例将 strict
验证添加到 contacts
集合,并在尝试更新无效文档时显示结果。
1
指定具有strict
验证级别的验证规则。
使用 strict
validationLevel
向 contacts
集合添加一个验证器:
db.runCommand( { collMod: "contacts", validator: { $jsonSchema: { bsonType: "object", required: [ "phone", "name" ], properties: { phone: { bsonType: "string", description: "phone must be a string and is required" }, name: { bsonType: "string", description: "name must be a string and is required" } } } }, validationLevel: "strict" } )
由于validationLevel
为strict
,因此当更新任何文档时, MongoDB都会检查该文档以进行验证。
2
3
观察结果。
两个更新操作均失败。 MongoDB会为每个操作返回以下输出:
MongoServerError: Document failed validation Additional information: { failingDocumentId: <id>, details: { operatorName: '$jsonSchema', schemaRulesNotSatisfied: [ { operatorName: 'properties', propertiesNotSatisfied: [ { propertyName: 'name', description: 'name must be a string and is required', details: [ { operatorName: 'bsonType', specifiedAs: { bsonType: 'string' }, reason: 'type did not match', consideredValue: <value>, consideredType: 'int' } ] } ] }, { operatorName: 'required', specifiedAs: { required: [ 'phone', 'name' ] }, missingProperties: [ 'phone' ] } ] } }
步骤:使用moderate
验证
以下示例将 moderate
验证添加到 contacts
集合,并在尝试更新无效文档时显示结果。
1
指定具有moderate
验证级别的验证规则。
使用 moderate
validationLevel
向 contacts
集合添加一个验证器:
db.runCommand( { collMod: "contacts", validator: { $jsonSchema: { bsonType: "object", required: [ "phone", "name" ], properties: { phone: { bsonType: "string", description: "phone must be a string and is required" }, name: { bsonType: "string", description: "name must be a string and is required" } } } }, validationLevel: "moderate" } )
因为validationLevel
是moderate
:
如果使用
_id: 1
更新文档,MongoDB 会应用新的验证规则,因为现有文档符合验证要求。如使用
_id: 2
更新文档,则 MongoDB 不会应用新验证规则,因为现有文档不符合验证要求。
2
3
观察结果。
MongoDB会为每个操作返回以下输出:
// _id: 1 MongoServerError: Document failed validation Additional information: { failingDocumentId: 1, details: { operatorName: '$jsonSchema', schemaRulesNotSatisfied: [ { operatorName: 'properties', propertiesNotSatisfied: [ { propertyName: 'name', description: 'name must be a string and is required', details: [ { operatorName: 'bsonType', specifiedAs: { bsonType: 'string' }, reason: 'type did not match', consideredValue: 10, consideredType: 'int' } ] } ] } ] } } // _id: 2 { acknowledged: true, insertedId: null, matchedCount: 1, modifiedCount: 0, upsertedCount: 0 }
输出显示:
对于带有
_id: 1
的文档,更新失败。 该文档满足初始验证要求, MongoDB将验证规则应用于该文档。文档更新成功,返回
_id: 2
。 此文档不符合初始验证要求, MongoDB不会对此文档应用验证规则。
重要
错误输出供人类使用。它将来可能会更改,不应在脚本中依赖它。