定义和实施模式
您可以通过定义模式来控制集合中文档的形状和内容。 模式允许您需要特定字段、控制字段值的类型以及在提交写入操作之前验证更改。
本指南介绍如何为关联的 MongoDB Atlas 集合定义、配置和部署模式。
注意
联合数据源不支持规则或模式。只能通过系统函数访问联合数据源。
定义架构
您可以在Atlas App Services用户界面中或使用App Services CLI为集合定义模式。
使用Atlas App Services用户界面时,您可以选择:
从集合中的现有数据生成模式,并根据需要进行修改。
通过添加字段级模式定义来手动定义模式。
从现有数据生成模式(可选)
如果集合中已有数据, App Services可以对集合中的文档子集进行示例,并根据示例生成模式。 如果您已有模式或更愿意手动定义模式,请跳至下一步。
您可以配置要抽样的文档数量,并使用 MongoDB 查询语言将样本限制为特定文档。默认情况下,App Services 从整个集合中随机抽样最多 500 个文档。
要从现有数据生成模式,请执行以下步骤:
从模式编辑器右侧的集合配置中,单击Generate Schema打开示例配置屏幕。
指定样本大小,最多为 50,000 个文档。
(可选)单击 Advanced 并指定查询、投影和/或排序,以便优化样本查询。使用查询和排序筛选器对特定的文档子集进行抽样,并使用投影筛选器对每个文档的特定字段子集进行抽样。
单击 Generate 以运行样本查询并生成模式。该过程可能最多需要一分钟,具体取决于抽样文档的数量和内容。
定义或修改模式
您可以手动定义模式,也可以通过添加字段级模式定义来修改现有模式。
您可以为每个集合定义一个BSON模式。 每个集合模式的根级类型是 object
模式,表示集合中的文档。 您可以在根模式的properties
字段中为文档字段定义其他模式。
JSON 模式对象中可用的字段取决于模式定义的值类型。有关支持的类型列表以及如何配置这些类型的详细信息,请参阅模式类型。
例子
一个群组使用 App Services 运行一个投票应用,13 岁或以上的用户可以提交他们最喜欢颜色的排名列表。他们将投票存储在名为 votes
的 MongoDB 集合中,其中每个文档代表一个人的投票。每个投票必须包括此人的姓名、年龄和他们最喜欢颜色的数组。每种颜色都有一个 rank
、name
和 hexCode
。以下是 votes
集合中的典型文档:
{ "name": "Jane Doe", "age": 42, "favoriteColors": [ { "rank": 1, "name": "RebeccaPurple", "hexCode": "#663399" }, { "rank": 2, "name": "DodgerBlue", "hexCode": "#1E90FF" }, { "rank": 3, "name": "SeaGreen", "hexCode": "#2E8B57" }, ] }
该群组可以使用以下模式来保证 votes
集合中的每个文档满足列出的约束条件:
{ "bsonType": "object", "required": ["name", "age", "favoriteColors"], "properties": { "name": { "bsonType": "string" }, "age": { "bsonType": "int", "minimum": 13, "exclusiveMinimum": false }, "favoriteColors": { "bsonType": "array", "uniqueItems": true, "items": { "bsonType": "object", "properties": { "rank": { "bsonType": "int" }, "name": { "bsonType": "string" }, "hexCode": { "bsonType": "string", "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$" } } } } } }
添加更改验证表达式(可选)
除了配置每个字段的内容外,还可以通过在模式的 validate
字段中定义验证表达式来验证对文档的更改。验证表达式可以使用 %%prev
和 %%prevRoot
扩展来在插入或更新操作发生之前访问字段或文档的值。
例子
考虑一个集合,其中文档的 owner_id
字段代表每个文档的所有者。此集合的业务规则指定,一旦文档拥有所有者,owner_id
的值就不应更改。我们可以使用以下验证表达式实施此约束,确保更新操作不会更改 owner_id
值,除非它是为了指定之前没有的所有者:
"owner_id": { "validate": { "%or": [ { "%%prev": { "%exists": false } }, { "%%prev": "%%this" } ] } }
我们还可以使用 %%prevRoot
扩展来创建以下等价验证表达式:
"owner_id": { "validate": { "%or": [ { "%%prevRoot.owner_id": { "%exists": false } }, { "%%prevRoot.owner_id": "%%root.owner_id" } ] } }
根据模式验证文档
保存集合模式后,您可以验证集合中的现有文档是否符合该模式。
App Services 使用抽样文档进行验证,就像自动生成模式一样。
要验证集合中的数据,请执行以下步骤:
单击 Run Validation 按钮打开验证配置窗口。
指定样本大小,最多为 50,000 个文档。
(可选)单击 Advanced 并指定查询和/或排序,以便将验证细化为特定的文档子集。
单击 Run Validation 对集合中的文档进行抽样,并根据模式验证每个文档。
验证完成后,App Services 会在 JSON Validation Errors 表中列出样本中的所有验证错误。该表的每一行均代表特定字段的特定类型的验证错误,并指明未能以此方式通过验证的文档数量。
对于每个验证错误,您可以使用 Actions 菜单下载失败的原始文档,或复制查找失败文档的 MongoDB 查询。
登录MongoDB Cloud
要使用 AppServices 配置您的应用,您必须使用 API密钥登录MongoDB Cloud,该密钥的范围为包含该应用的组织或项目。
appservices login --api-key="<MongoDB Cloud Public API Key>" --private-api-key="<MongoDB Cloud Private API Key>"
定义模式
要定义或修改集合的模式,请打开集合配置目录中的schema.json
配置文件。
提示
为集合搭建基架
如果尚未为集合定义规则或模式,则需要手动创建其配置目录和schema.json
:
# Create the collection's configuration directory mkdir -p data_sources/<service>/<db>/<collection> # Create the collection's schema file echo '{}' >> data_sources/<service>/<db>/<collection>/schema.json
每个文档的根级模式必须为object
类型。 您可以使用其他模式来配置properties
大量中的特定字段。 该模式至少应如下所示:
{ "bsonType": "object", "properties": { "<Field Name>": <Schema Document>, ... } }
定义变更验证(可选)
您可以通过在模式的validate
字段中定义验证表达式来验证对文档的更改。 在插入或更新操作发生 之前%%prevRoot
,验证表达式可以使用%%prev
和 扩展来访问权限字段或文档的值。
例子
考虑一个集合,其中文档的 owner_id
字段代表每个文档的所有者。此集合的业务规则指定,一旦文档拥有所有者,owner_id
的值就不应更改。我们可以使用以下验证表达式实施此约束,确保更新操作不会更改 owner_id
值,除非它是为了指定之前没有的所有者:
"owner_id": { "validate": { "%or": [ { "%%prev": { "%exists": false } }, { "%%prev": "%%this" } ] } }
我们还可以使用 %%prevRoot
扩展来创建以下等价验证表达式:
"owner_id": { "validate": { "%or": [ { "%%prevRoot.owner_id": { "%exists": false } }, { "%%prevRoot.owner_id": "%%root.owner_id" } ] } }
验证空类型
App Services 的默认行为是每个字段只接受一种类型。模式字段默认不能为空,因为 null
是唯一 BSON 类型。
将null
值与可选字段一起使用时,您可以配置App Services通过模式验证。 启用 null 类型验证可允许将字段值保留为模式中的类型或BSON null类型。 如果不启用空类型模式验证, App Services将拒绝传递到可选字段的null
值。 即使启用空类型验证,必填字段也决不能为空。
要在App Services UI 中启用空类型模式验证,请执行以下操作:
在Manage标题下方的左侧导航菜单中,选择App Settings 。
在General标签页上,导航至Null Type Schema Validation部分。将开关切换到ON 。
单击 Save 按钮。