模式验证
概述
在本指南中,您可以学习如何使用Rust驱动程序为您的MongoDB集合实现模式验证。
要实现模式验证,您必须提供一个由一组验证规则组成的JSON模式。如果您实现了模式验证,服务器仅允许您运行遵循验证规则的写操作。使用模式验证来限制指定集合中文档字段的类型和值范围。
您可以在创建集合时通过使用驱动程序方法定义模式验证规则,或者通过使用collMod
MongoDB命令将它们添加到现有集合中。本指南仅描述了在创建集合时启用模式验证的方法。有关在现有集合上启用模式验证的更多信息,请参阅collMod 服务器手册。
JSON模式验证
在创建具有模式验证规则的集合之前,您必须定义一个JSON模式。
JSON模式是一个包含指定集合验证规则的键值对的JSON对象。在顶级,此对象必须包含一个$jsonSchema
对象。该$jsonSchema
对象包括以下字段
title:为模式设置可选的描述。
required:指定每个文档的所需字段列表。
properties:为单个字段设置属性要求。
有关JSON模式对象字段的完整列表,请参阅服务器手册中的JSON Schema。
实现模式验证
您可以通过将模式和相关选项传递给CreateCollectionOptions
选项构建器方法来实现模式验证。
注意
设置选项
您可以通过直接将选项构建器方法链接到create_collection()
方法调用来设置CreateCollectionOptions
字段。如果您正在使用更早版本的驱动程序,您必须通过将选项构建器方法链接到builder()
方法来构建一个CreateCollectionOptions
实例。
调用以下CreateCollectionOptions
方法来指定新集合的验证选项
方法 | 描述 |
---|---|
validator() | 通过传递JSON模式指定集合的验证规则。 有关更多信息,请参阅本页上的JSON Schema Validation部分。 |
validation_level() | 指定哪些插入和更新操作受验证规则的约束。 可能的值: |
validation_action() | 指定如果插入的文档不遵循验证规则,驱动程序是否抛出错误或警告。 可能的值: |
示例
此示例创建了一个名为survey_answers
的集合,具有以下验证规范
validator()
方法接收一个 JSON 模式,指定每个文档中的answer
字段必须具有"yes"
或"no"
的值。validation_action()
方法指定当写操作违反验证规则时,驱动器是否抛出Error
。validation_level()
方法指定验证为中等
,因此验证规则仅适用于现有有效文档的插入和更新。
let validator = doc! { "$jsonSchema": doc! { "bsonType": "object", "title": "Answer Value Validation", "properties": doc! { "answer": doc! { "enum": vec! [ "yes", "no" ], } } } }; db.create_collection("survey_answers") .validator(validator) .validation_action(ValidationAction::Error) .validation_level(ValidationLevel::Moderate) .await?;
以下文档遵循验证规则,可以成功插入
{ "_id": { ... }, "question": "Do you like to exercise?", "answer": "yes" }, { "_id": { ... }, "question": "Do you like to play computer games?", "answer": "no" }
然而,如果您尝试插入以下文档,服务器会抛出错误,因为 answer
的值与任何有效选项都不匹配
{ "_id": { ... }, "question": "Do you like to exercise?", "answer": "depends on my mood" }
Error: Error { kind: Write(WriteError(WriteError { code: 121, code_name: None, message: "Document failed validation", details: Some(Document({"failingDocumentId": ObjectId("..."), "details": Document({"operatorName": String("$jsonSchema"), "title": String("Answer Value Validation"), ... })})) })), ... }
提示
绕过模式验证
要绕过一个集合的验证规则,将写入方法选项参数中的 bypass_document_validation
字段设置为 true
。这将忽略集合上的任何验证规则以及由 validation_level
定义的任何豁免。
要查看如何在 insert_one()
方法选项中指定此设置,请参阅修改 insert_one 行为部分的插入文档指南。
更多信息
有关本页上提到的 MongoDB 服务器操作的更多信息,请参阅服务器手册中的以下文档
API 文档
有关设置验证级别和操作的更多信息,请参阅以下 API 文档
validation_level 用于
validation_level()
辅助方法ValidationLevel 用于可能的
validation_level
值validation_action 用于
validation_action()
辅助方法ValidationAction 查看可能的
validation_action
值
要了解更多关于此指南中引用的其他方法或类型,请参阅以下文档