数据模型映射
在此页面上
本页包含有关 使用的 模式如何映射到 Device SDK Atlas App ServicesAtlas Device Sync使用的 SDK 对象模型的信息。Atlas
要了解如何生成这些数据模型,请参阅以下页面:
要从Atlas App Services模式生成 SDK 对象模型,请参阅生成 SDK 对象模型。
Atlas App Services要从Atlas Device SDK 客户端代码生成 Atlas App 模式,请参阅从 Atlas App ServicesSDK 对象模型生成 模式。
要详细了解 Device Sync 如何使用这两种数据模型,请参阅同步数据模型概述。
数据库、collection和对象
配置 Device Sync 时,您可以指定要存储数据的数据源。 此数据源可能包含多个数据库,每个数据库可能包含多个collection。
App Services schema将您的 Realm 数据库对象名称映射到 Device Sync 数据源中数据库中的collection。在 App Services 模式中的title
字段映射到 Realm 数据库中的 Realm 对象类型名称。由于title
名称决定客户端对象与相应 Atlas collection 之间的映射,因此该名称在同步数据源的所有模式中必须是唯一的。
title
不需要与collection名称匹配。
例子
考虑一个具有名为Pets
的数据库的应用。 它可能包含多个集合,例如Canine
和Feline
。 Canine
集合的App Services模式可能类似于以下示例中的 ,其中模式的title
字段为Dog
。 这会将名为Dog
的Realm数据库对象映射到Pets
数据库中的Canine
集合。
在同一集群中不能有其他title
为Dog
的模式。 例如,您无法将title
为Dog
的对象同步到同一集群中的Debug
和Test
数据库。 如果要将同一对象同步到不同的collection以用于应用程序开发,则必须使用不同的数据源 - 一个集群用于开发,另一个集群用于生产。
使用开发模式进行映射
当您在 Device Sync 配置中启用开发模式时,App Services 可以自动为您同步的 Realm 数据库对象创建集合和模式。 它会在您启用开发模式时指定的数据库中创建这些collection。
启用开发模式后,Sync 会查找其 App Services 模式具有与 Realm 数据库Realm 对象类型名称匹配的title
的集合。此collection可以位于关联数据源的任何数据库中。它不一定位于配置开发模式时添加的数据库中。
如果关联数据源的任何 App Services 模式中都没有相应的title
,App Services 将为此 Realm 对象类型创建一个新的 collection。该collection是在启用开发模式时指定的数据库中创建的。collection名称与Realm 对象类型匹配,相应的 App Servicestitle
模式有一个字段,其值是Realm 对象类型的名称。这将在 Realm 数据库对象和新集合之间创建映射。
例子
考虑具有名为Pets
的数据库的 Atlas 集群。 它包含一个包含现有数据的Feline
collection。
在应用程序代码中,您定义一个新的Dog
对象。 启用开发模式,并指定Pets
数据库作为为新Realm 对象类型创建collection的数据库。Dog
当您同步新的对象时,App ServicesDog
Pets
在数据库中创建collection并为其创建模式。模式中对象的title
为Dog
。
如果您稍后将新的 Person
对象添加到应用程序代码中,然后进行同步,则Atlas App Services会在 Pets
数据库中为此 Person
对象创建一个新集合。 如果要在不同数据库中为Person
对象创建集合,可以在不同数据库中为Person
对象定义和实施模式。 或者,您可以禁用并重新启用“开发模式”,然后选择其他数据库来创建新集合。
mappings
类型名称
title
字段包含该模式表示的对象类型的名称。 这相当于 Atlas Device SDK 中的类或模式名称。 类型名称在同步集群的所有模式中必须是唯一的,但也可以是任意名称,并且不需要与集合名称匹配。
传统方法是使用单数名词命名每个Realm 对象类型,例如“Dog”或“Person”。在开发模式下生成的模式或通过对现有文档采样生成的模式使用此约定。
注意
要使用 Atlas Device Sync,类型名称不能超过 57 个 UTF-8 字符。
属性类型
您可以为给定属性配置以下约束:
Parameter | 类型 | 说明 |
---|---|---|
类型 | 字符串 | SDK 对象模型中的每个属性都有明确定义的数据类型。 属性的类型可以是原始数据类型,也可以是在同一 SDK 对象模型中定义的对象类型。 类型还指定属性是包含单个值还是包含值的列表。 Realm 数据库支持以下属性类型:
有关支持的数据类型的更多信息,请参阅模式类型。 |
Optional | 布尔 | 可选属性可以包含 null 值,也可以从对象中完全省略。 默认情况下,除非明确标记为必需,否则所有属性都是可选的。 |
默认 | 布尔 | 如果客户端应用程序创建的新对象没有已定义属性的值,则该对象将使用默认值。 如果在客户端中打开的数据库,其模式子集不包含必需属性,则服务器将自动使用零默认值或空白默认值填充必需属性的值。 当您尝试创建一个缺少必填字段值的对象时,该对象将无法通过验证,并且不会持久保存到域中。 |
已索引 | 布尔 | 属性索引可显着提高某些读取操作的速度,但会增加写入操作的开销。 索引对于相等比较特别有用,例如根据属性值查询对象。 但是,索引会消耗额外的存储空间。 |
有关数据类型的 SDK 特定详细信息,请参阅以下内容:
数组属性
SDK 对象模型和Atlas App Services模式都支持数组属性。
有关数组属性的 SDK 特定详细信息,请参阅以下内容:
有关在Atlas App Services模式中对数组属性进行建模的更多信息,请参阅BSON types - 数组。 Atlas App Services模式支持 SDK 对象模型不支持的某些约束,例如指定最小和最大项目数。
混合属性
SDK 对象模型和Atlas App Services模式都支持混合类型属性。
混合字段可以包含任何支持的数据类型,在功能上充当对象或文档,而无需预定义的结构。
有关在Atlas App Services模式中对混合属性进行建模的更多信息,请参阅混合 - 模式类型。
混合属性中的集合
注意
5 月之后创建的应用程序28 、 2024
在 2024 年 5 月 28 日之后创建的 App Services 应用可以在混合数据属性中存储混合数据的集合(数组和字典)。您可以将集合嵌套在其他集合中,这样您就可以存储复杂的数据结构,例如 JSON 或 MongoDB 文档,而无需定义严格的数据模型。
要与Atlas Device SDK一起使用此功能,您必须使用以下最低 SDK 版本之一:
C++ SDK:版本待定
Flutter SDK:v2.0.0 或更高版本
Kotlin SDK:v2.0.0 或更高版本
.NET SDK:v12.2.0 或更高版本
Node.js SDK:v12.9.0 或更高版本
React Native SDK:v12.9.0 或更高版本
Swift SDK:v 10.51.0或更高版本
Java SDK 不支持此功能。
您可以联系支持部门,了解在使用受支持 SDK 的现有应用中启用此功能的更多信息。
您可以利用混合属性中的集合(数组或字典)来存储不适合预定义模式的数据,例如可变 JSON 数据或复杂的 MongoDB 文档。 由于混合数据集合可以包含其他混合数据集合,因此您可以将数据嵌套到复杂的结构中。 有关示例,请参阅本页的示例文档:混合数据的嵌套集合。
您可以将混合数据类型的集合存储在Atlas App Services模式或 SDK 对象模型模式中。
有关混合数据类型的 SDK 特定详细信息,请参阅以下内容:
注意
新的 Java SDK 应用程序无法使用 RealmAny
使用Java SDK的新App Services应用无法将数据模型与类型为RealmAny
的属性同步。 要在应用中通过Device Sync使用混合数据类型,请使用Kotlin SDK。
嵌入式对象
嵌入式对象作为嵌套数据嵌入到父对象内部。 嵌入式对象会继承父对象的生命周期。 它不能作为独立的数据库对象存在。
有关嵌入式对象的 SDK 特定详细信息,请参阅以下内容:
有关在Atlas App Services模式中对一对一关系进行建模的更多信息,请参阅嵌入式对象关系。
集
SDK 对象模型和Atlas App Services模式均支持 Set 数据类型。 集合是唯一值的集合。
有关集合的特定于 SDK 的详细信息,请参阅以下内容:
有关在Atlas App Services模式中对集进行建模的更多信息,请参阅集。
字典
SDK 对象模型和Atlas App Services模式均支持“字典”数据类型。 集合是唯一值的集合。 字典是与给定类型的值配对的动态且唯一的string键的集合。 字典在功能上是没有预定义字段名称的对象或文档。
有关字典的 SDK 特定详细信息,请参阅以下内容:
有关在Atlas App Services模式中对字典进行建模的更多信息,请参阅字典。
关系
SDK 对象模型支持以下类型的关系:
一对一关系:一对一关系是指一个对象以特定方式与不超过一个其他对象相关。
多对多关系:对多关系是指一个对象以特定方式与多个对象相关。
反向关系:反向关系将对象链接回在定义的对一或对多关系中引用该对象的任何其他对象。
Atlas App Services模式支持对一和对多关系。 Atlas App Services模式不支持反向关系。
有关关系的特定于 SDK 的详细信息,请参阅以下内容:
有关在Atlas App Services模式中进行关系建模的更多信息,请参阅关系。
地理空间数据
地理空间数据描述地球表面的点和其他数据。 Atlas App Services没有内置地理空间类型。 相反,您可以使用标准 GeoJSON 对象对地理数据进行建模。 有关地理空间数据的更多信息,请参阅模式类型。
有关地理空间数据的 SDK 特定详细信息,请参阅:
数据模型映射示例
此示例展示了如何使用 Device Sync 对Dog
进行建模。
应用程序服务模型
此Atlas App Services模式创建Device Sync使用的 Dog
数据模型。
{ "title": "Dog", "bsonType": "object", "required": [ "_id", "name" ], "properties": { "_id": { "bsonType": "objectId" }, "name": { "bsonType": "string" }, "age": { "bsonType": "int" } "breed": { "bsonType": "string" } "details": { "bsonType": "mixed" } } }
SDK 对象模型
以下代码示例在每个 Atlas Device SDK 中创建Dog
SDK 对象模型。
import Foundation import RealmSwift class Dog: Object { true) var _id: ObjectId (primaryKey: var age: Int? var breed: String? var name: String = "" var details: AnyRealmValue }
import io.realm.RealmObject; import org.bson.types.ObjectId; public class Dog extends RealmObject { private ObjectId _id; private Integer age; private String breed; private String name; private RealmAny details; // Standard getters & setters public ObjectId getId() { return _id; } public void setId(ObjectId _id) { this._id = _id; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getBreed() { return breed; } public void setBreed(String breed) { this.breed = breed; } public String getName() { return name; } public void setName(String name) { this.name = name; } public RealmAny getDetails() { return details; } public void setDetails(RealmAny details) { this.details = details; } }
import io.realm.RealmObject; import org.bson.types.ObjectId; open class Dog : RealmObject { var _id: ObjectId = ObjectId(), var age: Int? = null, var breed: String? = null, var name: String = "" var details: RealmValue? = null }
import 'package:realm/realm.dart'; part 'realm_models.realm.dart'; ()class _Dog { () '_id') ( late ObjectId id; int? age; String? breed; late String name; late RealmValue details; }
using System; using System.Collections.Generic; using Realms; using MongoDB.Bson; public class Dog : RealmObject { [ ] [ ] public ObjectId Id { get; set; } [ ] public int? Age { get; set; } [ ] public string Breed { get; set; } [ ] [ ] public string Name { get; set; } [ ] public RealmValue Details { get; set; } }
export const DogSchema = { name: 'Dog', properties: { _id: 'objectId', age: 'int?', breed: 'string?', name: 'string', }, primaryKey: '_id', details: 'mixed', };
export const DogSchema = { class Dog extends Realm.Object<Dog> { _id!: Realm.BSON.ObjectId; age?: number; breed?: string; name!: string; details?: Realm.Mixed; static schema: ObjectSchema = { name: 'Dog', properties: { _id: 'objectId', age: 'int?', breed: 'string?', name: 'string', details: 'mixed?', }, primaryKey: '_id', };
Atlas 中的数据
对Dog
数据模型使用 Device Sync 的应用程序根据以前的模式在 Atlas 中创建 MongoDB 文档。
示例文档
{ "_id": ObjectId('616f44305a205add93ff1081'), "age": 8, "breed": "Golden Retriever", "name": "Jasper", "details": null }
示例文档:混合数据的嵌套集合
混合数据的嵌套集合是以混合数据类型存储的字典或数组。 这可能类似于以下示例:
{ "_id": ObjectId('616f44305a205add93ff1081'), "age": 8, "breed": "Golden Retriever", "name": "Jasper", "details": { "vaccinations": ["rabies", "distemper"], "weight": 65.5, "isNeutered": true, "vetVisits": [ { "date": 2002-08-18T04:56:07.000+00:00, "reason": "annual checkup" }, { "date": 2003-08-18T04:56:07.000+00:00, "reason": "annual checkup" } ] } }
注意
5 月之后创建的应用程序28 、 2024
在 2024 年 5 月 28 日之后创建的 App Services 应用可以在混合数据属性中存储混合数据的集合(数组和字典)。您可以将集合嵌套在其他集合中,这样您就可以存储复杂的数据结构,例如 JSON 或 MongoDB 文档,而无需定义严格的数据模型。
要与Atlas Device SDK一起使用此功能,您必须使用以下最低 SDK 版本之一:
C++ SDK:版本待定
Flutter SDK:v2.0.0 或更高版本
Kotlin SDK:v2.0.0 或更高版本
.NET SDK:v12.2.0 或更高版本
Node.js SDK:v12.9.0 或更高版本
React Native SDK:v12.9.0 或更高版本
Swift SDK:v 10.51.0或更高版本
Java SDK 不支持此功能。
您可以联系支持部门,了解在使用受支持 SDK 的现有应用中启用此功能的更多信息。