Docs 菜单
Docs 主页
/ /
Atlas App Services
/ /

定义和实施模式

在此页面上

  • 定义架构
  • 验证空类型

您可以通过定义模式来控制集合中文档的形状和内容。 模式允许您需要特定字段、控制字段值的类型以及在提交写入操作之前验证更改。

本指南介绍如何为关联的 MongoDB Atlas 集合定义、配置和部署模式。

注意

联合数据源不支持规则或模式。只能通过系统函数访问联合数据源。

您可以在Atlas App Services用户界面中或使用App Services CLI为集合定义模式。

使用Atlas App Services用户界面时,您可以选择:

  • 从集合中的现有数据生成模式,并根据需要进行修改。

  • 通过添加字段级模式定义来手动定义模式。

1

在左侧导航菜单中,单击Schema Data Access下方的 ,打开模式编辑器。集合配置屏幕显示在Collections标签页中。 Atlas App Services会扫描关联集群以查找现有集合,并将它们列在模式编辑器的左侧。

从菜单中查找并选择您的集合,以在模式编辑器的右侧显示集合配置。

App Services用户界面中的“Schema”(模式)屏幕
点击放大
2

如果集合中已有数据, App Services可以对集合中的文档子集进行示例,并根据示例生成模式。 如果您已有模式或更愿意手动定义模式,请跳至下一步。

您可以配置要抽样的文档数量,并使用 MongoDB 查询语言将样本限制为特定文档。默认情况下,App Services 从整个集合中随机抽样最多 500 个文档。

要从现有数据生成模式,请执行以下步骤:

  1. 从模式编辑器右侧的集合配置中,单击Generate Schema打开示例配置屏幕。

  2. 指定样本大小,最多为 50,000 个文档。

  3. (可选)单击 Advanced 并指定查询、投影和/或排序,以便优化样本查询。使用查询和排序筛选器对特定的文档子集进行抽样,并使用投影筛选器对每个文档的特定字段子集进行抽样。

  4. 单击 Generate 以运行样本查询并生成模式。该过程可能最多需要一分钟,具体取决于抽样文档的数量和内容。

App Services用户界面中的“生成模式”示例大小输入
点击放大
3

您可以手动定义模式,也可以通过添加字段级模式定义来修改现有模式。

您可以为每个集合定义一个BSON模式。 每个集合模式的根级类型是 object模式,表示集合中的文档。 您可以在根模式的properties字段中为文档字段定义其他模式。

JSON 模式对象中可用的字段取决于模式定义的值类型。有关支持的类型列表以及如何配置这些类型的详细信息,请参阅模式类型

例子

一个群组使用 App Services 运行一个投票应用,13 岁或以上的用户可以提交他们最喜欢颜色的排名列表。他们将投票存储在名为 votes 的 MongoDB 集合中,其中每个文档代表一个人的投票。每个投票必须包括此人的姓名、年龄和他们最喜欢颜色的数组。每种颜色都有一个 ranknamehexCode。以下是 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})$"
}
}
}
}
}
}
4

除了配置每个字段的内容外,还可以通过在模式的 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" }
]
}
}
5

配置模式后,单击 Save。保存后,App Services 立即开始为所有未来查询实施该模式。

注意

与模式不匹配的现有文档不会自动更新或验证,因此将来对这些文档的更改可能会导致模式验证失败。

6

保存集合模式后,您可以验证集合中的现有文档是否符合该模式。

App Services 使用抽样文档进行验证,就像自动生成模式一样。

要验证集合中的数据,请执行以下步骤:

  1. 单击 Run Validation 按钮打开验证配置窗口。

  2. 指定样本大小,最多为 50,000 个文档。

  3. (可选)单击 Advanced 并指定查询和/或排序,以便将验证细化为特定的文档子集。

  4. 单击 Run Validation 对集合中的文档进行抽样,并根据模式验证每个文档。

验证完成后,App Services 会在 JSON Validation Errors 表中列出样本中的所有验证错误。该表的每一行均代表特定字段的特定类型的验证错误,并指明未能以此方式通过验证的文档数量。

对于每个验证错误,您可以使用 Actions 菜单下载失败的原始文档,或复制查找失败文档的 MongoDB 查询。

在App Services用户界面中显示模式验证错误的表
点击放大
1

要使用 AppServices 配置您的应用,您必须使用 API密钥登录MongoDB Cloud,该密钥的范围为包含该应用的组织或项目。

appservices login --api-key="<MongoDB Cloud Public API Key>" --private-api-key="<MongoDB Cloud Private API Key>"
2

要使用appservices定义文档模式,您需要应用程序配置文件的本地副本。

要提取最新版本应用的本地副本,请运行以下命令:

appservices pull --remote="<Your App ID>"

提示

您还可以从 App Services 用户界面的Deploy > Import/Export App屏幕下载应用程序配置文件的副本。

3

要定义或修改集合的模式,请打开集合配置目录中的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大量中的特定字段。 该模式至少应如下所示:

/data_sources/<service>/<db>/<collection>/schema.json
{
"bsonType": "object",
"properties": {
"<Field Name>": <Schema Document>,
...
}
}
4

您可以通过在模式的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" }
]
}
}
5

定义并保存schema.json后,您可以将更新的配置推送到远程应用。 App Services CLI在推送时立即部署新模式。

appservices push --remote="<Your App ID>"

App Services 的默认行为是每个字段只接受一种类型。模式字段默认不能为空,因为 null 是唯一 BSON 类型

null值与可选字段一起使用时,您可以配置App Services通过模式验证。 启用 null 类型验证可允许将字段值保留为模式中的类型或BSON null类型。 如果不启用空类型模式验证, App Services将拒绝传递到可选字段的null值。 即使启用空类型验证,必填字段也决不能为空。

要在App Services UI 中启用空类型模式验证,请执行以下操作:

  1. Manage标题下方的左侧导航菜单中,选择App Settings

  2. General标签页上,导航至Null Type Schema Validation部分。将开关切换到ON

  3. 单击 Save 按钮。

后退

Schemas