Schemas
Overview
什么是模式?
模式是一个JSON对象,用于定义数据的结构和内容。 您可以使用Atlas App Services 的BSON 模式,该模式扩展了JSON schema 标准,用于定义应用程序的数据模型,并在创建、更改或删除文档时验证文档。
架构表示数据类型,而不是具体值。App Services 支持多种内置架构类型,包括字符串和数字等基元以及对象和数组等结构类型,您可以将它们组合起来创建表示自定义对象类型的架构。
例如,下面是有关汽车数据的基本模式和一些符合该模式的汽车对象:
{ "title": "car", "required": [ "_id", "year", "make", "model", "miles" ], "properties": { "_id": { "bsonType": "objectId" }, "year": { "bsonType": "string" }, "make": { "bsonType": "string" }, "model": { "bsonType": "string" }, "miles": { "bsonType": "number" } } }
{ "_id": ObjectId("5af712eff26b29dc5c51c60f"), "year": "2017", "make": "Honda", "model": "Civic", "miles": 117424 } { "_id": ObjectId("5af714eff24b294c5251cf04"), "year": "2020", "make": "Ford", "model": "Mustang", "miles": 13579 }
为什么要定义模式?
模式是应用程序数据模型的规范。定义模式后,App Services 将为你提供其他工具和服务,以处理符合该模式的数据。
App Services 在许多应用程序服务中使用架构:
Atlas Device Sync 利用模式在领域与 MongoDB Atlas 之间同步数据。应用服务还可以根据您的模式为您生成惯用的 SDK 对象模型。
数据访问规则会在每次请求之前和之后验证数据是否符合您的模式。如果任何文档未能通过验证,App Services 会阻止或回滚整个请求。
定义架构
根级集合模式可以包含描述类型属性的附加模式。每个根级模式都是一个 object
模式,具有以下形式
{ "bsonType": "object", "title": "<Type Name>", "required": ["<Required Field Name>", ...], "properties": { "<Field Name>": <Schema> } }
您可以使用任何支持的模式类型来配置对象的属性:
注意
要了解如何在应用中配置和部署模式,请参阅定义和实施模式。
App Service 如何实施架构
App Services 根据集合模式验证 MongoDB 集合上的所有写操作(插入、更新和删除)。它在每次请求前后都会检查每个文档,确保所有属性都符合模式,并且没有发生无效更改。
App Services 会计算所有文档写入操作的结果,并将其与模式进行比较,然后再将这些写入提交到集群。如果请求中任一写入操作的结果与模式不匹配,App Services 会向用户返回错误,而不对请求进行任何更改。
例子
集合的模式如下:
{ "title": "person", "properties": { "_id": { "bsonType": "objectId" }, "name": { "bsonType": "string" } } }
有权读取和写入所有字段的用户想要更新特定文档的 name
字段。他们发出以下查询:
collection.updateOne( { "_id": BSON.ObjectId("5ae782e48f25b9dc5c51c4d0") }, { "$set": { "name": 42 } } )
该查询尝试将 name
的值设置为数字 42
,但模式要求该值为 string
。即使用户有权更新文档,App Services 也会拒绝此写入操作,因为写入结果不符合模式。
App Services 模式与内置模式验证
App Services 中的架构不同于 MongoDB 的内置模式验证。两者都使用 JSON schema 标准,并支持 BSON 类型。但是,App Services 不使用集群的内置模式,并且可能以与内置模式不兼容的方式与集群交互。
如果要同时使用 App Services 架构和集群的内置模式验证,请考虑以下事项:
最初将集群的模式验证级别设置为“警告”。然后,监控活动并处理现有警告。一旦确信两个模式验证层兼容,您就可以将验证级别升级到“错误”。
如果您正在使用 Device Sync,请避免使用嵌入文档和嵌入文档数组的必填字段。同步协议可能会将有效的嵌入对象写入拆分为多个等效写入,而这些写入不单独包括所有必填字段。
如果正在使用 Device Sync,请避免区分
undefined
、null
、空数组和不带字段的嵌入式对象。同步协议将这些值视为功能等效值。
如需有关同时使用这两个模式验证层的帮助,请联系 MongoDB 支持人员。