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

数据模型映射

在此页面上

  • 数据库、collection和对象
  • 使用开发模式进行映射
  • mappings
  • 类型名称
  • 属性类型
  • 数组属性
  • 混合属性
  • 嵌入式对象
  • 字典
  • 关系
  • 地理空间数据
  • 数据模型映射示例
  • 应用程序服务模型
  • SDK 对象模型
  • Atlas 中的数据

本页包含有关 使用的 模式如何映射到 Device SDK Atlas App ServicesAtlas Device Sync使用的 SDK 对象模型的信息。Atlas

要了解如何生成这些数据模型,请参阅以下页面:

要详细了解 Device Sync 如何使用这两种数据模型,请参阅同步数据模型概述。

配置 Device Sync 时,您可以指定要存储数据的数据源。 此数据源可能包含多个数据库,每个数据库可能包含多个collection。

App Services schema将您的 Realm 数据库对象名称映射到 Device Sync 数据源中数据库中的collection。在 App Services 模式中的title字段映射到 Realm 数据库中的 Realm 对象类型名称。由于title名称决定客户端对象与相应 Atlas collection 之间的映射,因此该名称在同步数据源的所有模式中必须是唯一的。

title不需要与collection名称匹配。

例子

考虑一个具有名为Pets的数据库的应用。 它可能包含多个集合,例如CanineFelineCanine集合的App Services模式可能类似于以下示例中 ,其中模式的title字段为Dog 。 这会将名为Dog的Realm数据库对象映射到Pets数据库中的Canine集合。

在同一集群中不能有其他titleDog的模式。 例如,您无法将titleDog的对象同步到同一集群中的DebugTest数据库。 如果要将同一对象同步到不同的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 集群。 它包含一个包含现有数据的Felinecollection。

在应用程序代码中,您定义一个新的Dog对象。 启用开发模式,并指定Pets数据库作为为新Realm 对象类型创建collection的数据库。Dog当您同步新的对象时,App ServicesDog Pets在数据库中创建collection并为其创建模式。模式中对象的titleDog

如果您稍后将新的 Person 对象添加到应用程序代码中,然后进行同步,则Atlas App Services会在 Pets 数据库中为此 Person 对象创建一个新集合。 如果要在不同数据库中为Person对象创建集合,可以在不同数据库中为Person对象定义和实施模式。 或者,您可以禁用并重新启用“开发模式”,然后选择其他数据库来创建新集合。

title字段包含该模式表示的对象类型的名称。 这相当于 Atlas Device SDK 中的类或模式名称。 类型名称在同步集群的所有模式中必须是唯一的,但也可以是任意名称,并且不需要与集合名称匹配。

传统方法是使用单数名词命名每个Realm 对象类型,例如“Dog”或“Person”。在开发模式下生成的模式或通过对现有文档采样生成的模式使用此约定。

注意

要使用 Atlas Device Sync,类型名称不能超过 57 个 UTF-8 字符。

您可以为给定属性配置以下约束:

Parameter
类型
说明
类型
字符串

SDK 对象模型中的每个属性都有明确定义的数据类型。 属性的类型可以是原始数据类型,也可以是在同一 SDK 对象模型中定义的对象类型。 类型还指定属性是包含单个值还是包含值的列表。

Realm 数据库支持以下属性类型:

  • 布尔

  • 整型

  • double

  • 字符串

  • 日期

  • Decimal128

  • ObjectId

  • uuid

  • 混合

  • 阵列

  • 对象

有关支持的数据类型的更多信息,请参阅模式类型。

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 数据模型。

Atlas App Services模式中定义的 Dog 数据模型
{
"title": "Dog",
"bsonType": "object",
"required": [
"_id",
"name"
],
"properties": {
"_id": {
"bsonType": "objectId"
},
"name": {
"bsonType": "string"
},
"age": {
"bsonType": "int"
}
"breed": {
"bsonType": "string"
}
"details": {
"bsonType": "mixed"
}
}
}

以下代码示例在每个 Atlas Device SDK 中创建Dog SDK 对象模型。

Swift SDK 数据模型中定义的 Dog 类
import Foundation
import RealmSwift
class Dog: Object {
@Persisted(primaryKey: true) var _id: ObjectId
@Persisted var age: Int?
@Persisted var breed: String?
@Persisted var name: String = ""
@Persisted var details: AnyRealmValue
}
Java SDK数据模型中定义的 Dog 类
import io.realm.RealmObject;
import org.bson.types.ObjectId;
public class Dog extends RealmObject {
@PrimaryKey
@Required
private ObjectId _id;
private Integer age;
private String breed;
@Required
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; }
}
Kotlin SDK数据模型中定义的 Dog 类
import io.realm.RealmObject;
import org.bson.types.ObjectId;
open class Dog : RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId(),
var age: Int? = null,
var breed: String? = null,
var name: String = ""
var details: RealmValue? = null
}
Flutter SDK数据模型中定义的 Dog 类
import 'package:realm/realm.dart';
part 'realm_models.realm.dart';
@RealmModel()
class _Dog {
@PrimaryKey()
@MapTo('_id')
late ObjectId id;
int? age;
String? breed;
late String name;
late RealmValue details;
}
.NET SDK数据模型中定义的 Dog 类
using System;
using System.Collections.Generic;
using Realms;
using MongoDB.Bson;
public class Dog : RealmObject
{
[MapTo("_id")]
[PrimaryKey]
public ObjectId Id { get; set; }
[MapTo("age")]
public int? Age { get; set; }
[MapTo("breed")]
public string Breed { get; set; }
[MapTo("name")]
[Required]
public string Name { get; set; }
[MapTo("details")]
public RealmValue Details { get; set; }
}
Node.js SDK数据模型中定义的 Dog 类
export const DogSchema = {
name: 'Dog',
properties: {
_id: 'objectId',
age: 'int?',
breed: 'string?',
name: 'string',
},
primaryKey: '_id',
details: 'mixed',
};
React Native SDK数据模型中定义的 Dog 类
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',
};

Dog数据模型使用 Device Sync 的应用程序根据以前的模式在 Atlas 中创建 MongoDB 文档。

在 Atlas 中创建的 Dog 文档
{
"_id": ObjectId('616f44305a205add93ff1081'),
"age": 8,
"breed": "Golden Retriever",
"name": "Jasper",
"details": null
}

混合数据的嵌套集合是以混合数据类型存储的字典或数组。 这可能类似于以下示例:

MongoDB 中包含混合数据的 Dog 文档
{
"_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 的现有应用中启用此功能的更多信息。

后退

进行重大模式更改