データモデル マッピング
項目一覧
このページには、Atlas Device Sync で使用される App Services スキーマが、Atlas Device SDK で使用される SDK オブジェクトモデルにどのようにマッピングされるかについての情報が含まれています。
これらのデータモデルを生成する方法については、次のページを参照してください。
App Services スキーマから SDK オブジェクトモデルを生成するには、「 SDK オブジェクトモデルの生成 」を参照してください。
Atlas Device SDK クライアント コードから App Services スキーマを生成するには、「 SDK オブジェクトモデルから App Services スキーマを生成する 」を参照してください。
Device Sync がこれら 2 つのデータモデルをどのように使用するかについて詳しくは、「同期データモデルの概要 」を参照してください。
データベース、コレクション、オブジェクト
Device Sync を構成するときは、データを保存するデータソースを指定します。 このデータソースには複数のデータベースが含まれる場合があり、各データベースには複数のコレクションが含まれる場合があります。
Atlas App Services スキーマは、Realm Database のオブジェクト名を、Device Sync データソース内のデータベースのコレクションにマッピングします。 App Services スキーマの title
フィールドは、Realm Database のオブジェクトタイプ名にマップされます。 title
名によってクライアント オブジェクトと適切な Atlas コレクションの間のマッピングが決定されるため、この名前は同期されたデータソース内のすべてのスキーマ間で一意である必要があります。
title
はコレクション名と一致する必要はありません。
例
Pets
という名前のデータベースを持つアプリを考えてみましょう。 Canine
やFeline
など、複数のコレクションが含まれる場合があります。 Canine
コレクションの App Services スキーマは、以下の例のに似ており、スキーマのtitle
フィールドはDog
です。 これにより、 Dog
という Realm Database オブジェクトがPets
データベース内のCanine
コレクションにマッピングされます。
同じクラスター内でtitle
がDog
である別のスキーマは存在できませんでした。 たとえば、title
Dog
Debug
のTest
を持つオブジェクトを、同じクラスター内の データベースと データベースの両方に同期することはできません。アプリ開発目的で同じオブジェクトを異なるコレクションに同期する場合は、異なるデータソースを使用する必要があります(開発用クラスターと本番用クラスターは別)。
開発モードでのマッピング
Device Sync 構成で開発モードを有効にすると、App Services は同期する Realm Database オブジェクトのコレクションとスキーマを自動的に作成できます。 開発モードを有効にするときに、指定したデータベースにこれらのコレクションが作成されます。
開発モードを有効にすると、Sync は、Realm Database オブジェクトタイプの名前と一致するtitle
を持つ App Services スキーマを持つコレクションを検索します。 このコレクションは、リンクされたデータ ソース内の任意のデータベースにある可能性があります。 開発モードを設定するときに追加するデータベース内にある必要はありません。
リンクされたデータソース内のどの App Services スキーマにも対応するtitle
がない場合、App Services はこのオブジェクト型の新しいコレクションを作成します。 このコレクションは、開発モードを有効にするときに指定するデータベースに作成されます。 コレクション名はオブジェクトのタイプと一致し、対応する App Services スキーマには、オブジェクトタイプの名前である値を持つtitle
フィールドがあります。 これにより、Realm Database オブジェクトと新しいコレクションの間にマッピングが作成されます。
例
Pets
という名前のデータベースを持つ Atlas クラスターを考えてみましょう。 既存のデータを含むFeline
コレクションが含まれています。
アプリケーション コードで、新しいDog
オブジェクトを定義します。 開発モードを有効にし、新しいオブジェクトタイプのコレクションを作成するデータベースとしてPets
データベースを指定します。 新しいDog
オブジェクトを同期すると、App Services はPets
データベースにDog
コレクションを作成し、そのスキーマを作成します。 スキーマ内のオブジェクトのtitle
はDog
です。
後で新しいPerson
オブジェクトをアプリケーション コードに追加して同期すると、App Services はPets
データベースにこのPerson
オブジェクト用の新しいコレクションを作成します。 別のデータベースにPerson
オブジェクトのコレクションを作成する場合は、別のデータベースにあるPerson
オブジェクトのスキーマを定義および強制できます。 または、開発モードを無効にしてから再度有効にし、新しいコレクションを作成する別のデータベースを選択することもできます。
mappings
タイプ名
title
フィールドには、スキーマで表されるオブジェクトタイプの名前が含まれます。 これは、Atlas Device SDK のクラスまたはスキーマ名と同等です。 タイプ名は同期されたクラスター内のすべてのスキーマ間で一意である必要がありますが、それ以外は任意であり、コレクション名と一致する必要はありません。
従来のアプローチでは、「Dog」や「 people 」のように、各オブジェクトタイプに単数形の名を付けます。 開発モードで、または既存のドキュメントのサンプリングによって生成されたスキーマは、この規則を使用します。
注意
Atlas Device Sync を使用するには、タイプ名が 57 文字の UTF-8 文字を超えることはできません。
プロパティ タイプ
特定のプロパティに対して次の制約を構成できます。
Parameter | タイプ | 説明 |
---|---|---|
タイプ | 文字列 | SDK オブジェクトモデル内のすべてのプロパティには、厳密に定義されたデータ型があります。 プロパティの型は、プリミティブ データ型、または同じ SDK オブジェクトモデルで定義されたオブジェクトタイプにすることができます。 また、 型は、プロパティに単一の値が含まれているか、値のリストが含まれているかを指定します。 Realm データベースは次のプロパティ タイプをサポートしています。
サポートされているデータ型の詳細については、「スキーマ タイプ 」を参照してください。 |
任意 | ブール値 | 任意プロパティには、null 値を含めることも、オブジェクトから完全に省略することもできます。 デフォルトでは、必須として明示的にマークされていない限り、すべてのプロパティは任意です。 |
default | ブール値 | クライアント アプリケーションが定義されたプロパティの値を持たない新しいオブジェクトを作成する場合、オブジェクトは代わりにデフォルト値を使用します。 必須プロパティを含まないスキーマ サブセットを使用してクライアントでデータベースを開くと、サーバーは必須プロパティの値にゼロまたは空白のデフォルト値を自動的に入力します。 必須 フィールドの値が欠落しているオブジェクトを作成しようとすると、検証に失敗し、Realm に保持されません。 |
インデックス付き | ブール値 | プロパティ インデックスにより、特定の読み取り操作の速度が大幅に向上しますが、書込み操作のオーバーヘッドが増加します。 インデックスは、プロパティの値に基づいてオブジェクトを照会するなど、等価比較に特に役立ちます。 ただし、インデックスは追加のストレージを消費します。 |
データ型に関する SDK 固有の詳細については、以下を参照してください。
配列のプロパティ
SDK オブジェクトモデルと App Services スキーマはいずれも配列プロパティをサポートしています。
配列プロパティの SDK 固有の詳細については、以下を参照してください。
Atlas App Services スキーマで配列プロパティをモデル化する方法の詳細については、「 BSON types - 配列 」を参照してください。 App Services スキーマは、項目の最小数と最大数の指定など、SDK オブジェクトモデルが実行しない特定の制約をサポートしています。
混合プロパティ
SDK オブジェクトモデルと App Services スキーマはどちらも混合型プロパティをサポートしています。
混合フィールドにはサポートされている任意のデータ型を含めることができ、機能的には事前に定義された構造を持たないオブジェクトまたはドキュメントとして機能します。
App Services スキーマで混合プロパティをモデル化する方法の詳細については、「混合 - スキーマ タイプ 」を参照してください。
混合プロパティのコレクション
注意
2024 年 5 月 28 日の後に作成されたアプリ
年 5 月 日以降に作成された App Services アプリは、混合データのコレクション(配列と辞書)を混合データ プロパティに2024でき28 。 コレクション内に他のコレクションをネストできるため、厳密なデータモデルを定義しなくても、JSON や MongoDB ドキュメントなどの複雑なデータ構造を保存できます。
この機能を Atlas Device SDK で使用するには、次のいずれかの最小 SDK バージョンを使用する必要があります。
C++ SDK: バージョン TDB
Flutter SDK: v 2.0.0以降
Kotlin SDK: v 2.0.0以降
.NET SDK: v 12.2.0以降
Node.js SDK: v 12.9.0以降
React Native SDK: v 12.9.0以降
Swift SDK: v10.51.0 以降
この機能は Java SDK ではサポートされていません。
サポートされている SDK を使用して既存のアプリでこの機能を有効にする方法の詳細については、 サポートにお問い合わせください 。
混合プロパティではコレクション(配列または辞書)を活用して、変数 JSON データや複雑な MongoDB ドキュメントなど、事前定義されたスキーマに適さないデータを保存できます。 混合データのコレクションには、他の混合データのコレクションを含めることができるため、複雑な構造にデータをネストできます。 例については、このページの「サンプル ドキュメント: 混合データのネストされたコレクション 」を参照してください。
App Services スキーマまたは SDK オブジェクトモデル スキーマには、混合データ型でコレクションを保存できます。
混合データ型に関する SDK 固有の詳細については、以下を参照してください。
注意
新しい Java SDK アプリは RealmAny を使用できません
Java SDK を使用する新しい App Services アプリは、 RealmAny
タイプのプロパティを持つデータモデルを同期できません。 アプリ内で Device Sync で混合データ型を使用するには、 Kotlin SDK を使用します。
埋め込みオブジェクト
埋め込みオブジェクトは親オブジェクト内にネストされたデータとして埋め込まれます。 埋め込みオブジェクトは、親オブジェクトのライフサイクルを継承します。 独立したデータベース オブジェクトとして存在することはできません。
埋め込みオブジェクトに関する SDK 固有の詳細については、以下を参照してください。
Atlas App Services スキーマでの 1 対 1 の関係のモデル化の詳細については、「埋め込みオブジェクトの関係 」を参照してください。
セット
SDK オブジェクトモデルと App Services スキーマはどちらも Set データ型をサポートしています。 セットは、一意の値のコレクションです。
セットに関する SDK 固有の詳細については、以下を参照してください。
App Services スキーマでセットをモデル化する方法の詳細については、「セット 」を参照してください。
辞書
SDK オブジェクトモデルと App Services スキーマは両方とも辞書データ型をサポートしています。 セットは、一意の値のコレクションです。 辞書は、特定の type の値とペアになった動的な一意の string キーのコレクションです。 機能的には、フィールド名が事前に定義されていないオブジェクトまたはドキュメントです。
辞書に関する SDK 固有の詳細については、以下を参照してください。
App Services スキーマで辞書をモデル化する方法の詳細については、 「 辞書 」を参照してください。
関係
SDK オブジェクトモデルは次のタイプの関係をサポートしています。
対 1 の関係: 対 1 の関係とは、あるオブジェクトが特定の方法で他のオブジェクトのみに関連付けられている ことを意味します。
対多の関係: 対多の関係とは、オブジェクトが複数のオブジェクトに特定の方法で関連していることを意味します。
逆関係: 逆関係は、定義された 1 対多または 1 対多の関係で、オブジェクトを参照する他のオブジェクトにリンクします。
App Services スキーマは 1 対多の関係をサポートします。 App Services スキーマは逆の関係をサポートしていません。
関係に関する SDK 固有の詳細については、以下を参照してください。
App Services スキーマでの関係のモデル化の詳細については、「関係 」を参照してください。
地理空間データ
地理空間データでは、地表の地点とその他のデータが記述されます。 App Services には地理空間型データは組み込まれておらず、 代わりに、標準的な GeoJSON オブジェクトを使用して地理データをモデル化します。 地理空間データの詳細については、「スキーマ タイプ 」を参照してください。
地理空間データに関する SDK 固有の詳細については、以下を参照してください。
データモデルのマッピング例
この例では、Device Sync を使用してDog
をモデル化する方法を示します。
App Services スキーマ
この 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" } ] } }
注意
2024 年 5 月 28 日の後に作成されたアプリ
年 5 月 日以降に作成された App Services アプリは、混合データのコレクション(配列と辞書)を混合データ プロパティに2024でき28 。 コレクション内に他のコレクションをネストできるため、厳密なデータモデルを定義しなくても、JSON や MongoDB ドキュメントなどの複雑なデータ構造を保存できます。
この機能を Atlas Device SDK で使用するには、次のいずれかの最小 SDK バージョンを使用する必要があります。
C++ SDK: バージョン TDB
Flutter SDK: v 2.0.0以降
Kotlin SDK: v 2.0.0以降
.NET SDK: v 12.2.0以降
Node.js SDK: v 12.9.0以降
React Native SDK: v 12.9.0以降
Swift SDK: v10.51.0 以降
この機能は Java SDK ではサポートされていません。
サポートされている SDK を使用して既存のアプリでこの機能を有効にする方法の詳細については、 サポートにお問い合わせください 。