X DevAPI 用户指南  / 第 4 章使用集合  /  4.6 JSON 模式验证

4.6 JSON 模式验证

从 8.0.21 版本开始,集合可以配置为根据 JSON 模式验证文档。这使您能够要求文档在插入或更新集合之前具有特定结构。您指定一个 JSON 架构,如 http://json-schema.org中所述。模式验证由服务器从 8.0.19 版本开始执行,如果集合中的文档未针对分配的 JSON 模式进行验证,则返回错误消息。有关 MySQL 中 JSON 模式验证的更多信息,请参阅 JSON 模式验证函数。本节介绍如何配置集合以根据 JSON 模式验证文档。

笔记

Connector/J 实现 JSON 模式验证的方式与本节中描述的模型非常不同。有关详细信息,请参阅 MySQL Connector/J 8.0 开发人员指南中的 模式验证

要启用或修改 JSON 模式验证,您可以向集合提供一个validationJSON 对象,如下所示:

Press CTRL+C to copy
{ validation: { level: "off|strict", schema: "json-schema" } }

validation是一个 JSON 对象,其中包含可用于配置 JSON 模式验证的键。第一个键是level,它可以取值 strictor off。第二个键schema是一个 JSON 架构,如 http://json-schema.org中所定义。如果level键设置为 strict,则在将文档添加到集合中时验证文档, json-schema或者,如果它们已经在集合中,则在通过某些操作更新文档时进行验证。如果文档未通过验证,则服务器会生成错误并且操作失败。如果 level密钥设置为off,则不会根据 json-schema.

创建经过验证的集合

要在创建新集合时启用 JSON 架构验证,请提供validation如上所述的 JSON 对象。例如,要创建一个包含经度和纬度值的集合并需要将这些值验证为数字:

MySQL 外壳 JavaScript 代码

Press CTRL+C to copy
var coll = schema.createCollection("longlang", { validation: { level: "strict", schema: { "id": "http://json-schema.org/geo", "$schema": "http://json-schema.org/draft-06/schema#", "description": "A geographical coordinate", "type": "object", "properties": { "latitude": { "type": "number" }, "longitude": { "type": "number" } }, "required": ["latitude", "longitude"] } } })

MySQL 外壳 Python 代码

Press CTRL+C to copy
coll = schema.create_collection("longlang", validation={ "level": "strict", "schema": { "id": "http://json-schema.org/geo", "$schema": "http://json-schema.org/draft-06/schema#", "description": "A geographical coordinate", "type": "object", "properties": { "latitude": { "type": "number" }, "longitude": { "type": "number" } }, "required": ["latitude", "longitude"] } })

Node.js JavaScript 代码

Press CTRL+C to copy
var coll = schema.createCollection("longlang", { validation: { level: "strict", schema: { "id": "http://json-schema.org/geo", "$schema": "http://json-schema.org/draft-06/schema#", "description": "A geographical coordinate", "type": "object", "properties": { "latitude": { "type": "number" }, "longitude": { "type": "number" } }, "required": ["latitude", "longitude"] } } })

C#代码

Press CTRL+C to copy
var collOptions = CreateCollectionOptions() { reuseExistingObject = false, validation = Validation() { level = ValidationLevel.Strict, schema = "{\"id\": \"http://json-schema.org/geo\"," + "\"$schema\": \"http://json-schema.org/draft-06/schema#\"," + " \"description\": \"A geographical coordinate\"," + " \"type\": \"object\"," + " \"properties\": {" + " \"latitude\": {" + " \"type\": \"number\"" + " }," + " \"longitude\": {" + " \"type\": \"number\"" + " }" + " }," + " \"required\": [\"latitude\", \"longitude\"]" + " }" } }; var coll = schema.CreateCollection("longlang", collOptions);

Python代码

Press CTRL+C to copy
coll = schema.create_collection("longlang", validation={ "level": "strict", "schema": { "id": "http://json-schema.org/geo", "$schema": "http://json-schema.org/draft-06/schema#", "description": "A geographical coordinate", "type": "object", "properties": { "latitude": { "type": "number" }, "longitude": { "type": "number" } }, "required": ["latitude", "longitude"] } })

修改集合验证

您可以修改集合以控制文档的 JSON 架构验证。例如,您可以启用或禁用验证,或更改用于验证文档的 JSON 模式。

为了修改集合的 JSON 模式验证,validation请在调用Collection.modify() 方法时提供一个 JSON 对象。例如,要修改集合以禁用 JSON 模式验证,validation对象将是:

Press CTRL+C to copy
{ validation: { "level": "off" } }

修改 JSON 模式验证时,您可以单独提供 level选项以仅更改模式验证级别。例如,传递上面显示的 JSON 对象以禁用 JSON 架构验证。这不会更改先前指定的 JSON 架构,也不会从集合中删除 JSON 架构。或者,您可以仅通过传递一个新的 JSON 模式对象来修改模式。