Device Sync によるモデルデータ - Swift SDK
Realm オブジェクトモデル
Realm オブジェクトを定義するには、 Objectからクラスを派生します。 それぞれに定義したモデルは、MongoDB Atlas の独自のコレクションにマップされます。 この例では、 Dog
とPerson
の両方が MongoDB Atlas の個別のコレクションにマッピングされます。
class Dog: Object { true) var _id = ObjectId() (primaryKey: var name = "" var age = 0 } class Person: Object { true) var _id = ObjectId() (primaryKey: var name = "" }
JSON Schema
Atlas App Services に対応するスキーマがあると、Device Sync は Atlas に同期するときに Realm Swift データ型を BSON に自動的に変換します。 クライアント デバイスが Device Sync 経由で App Services からデータを同期すると、SDK は BSON を Swift オブジェクトに変換します。 Device Sync を使用してデータを同期する代わりに、 MongoDB Atlas データに直接アクセスしてこれらのオブジェクトをクエリすると、BSON データ型が取得されます。 MongoDB Data Access は、同等の Swift オブジェクトに自動的にマッピングしません。
{ "title": "Dog", "bsonType": "object", "required": [ "_id" ], "properties": { "_id": { "bsonType": "objectId" }, "name": { "bsonType": "string" }, "age": { "bsonType": "long" } } }
{ "title": "Person", "bsonType": "object", "required": [ "_id" ], "properties": { "_id": { "bsonType": "objectId" }, "name": { "bsonType": "string" } } }
Realm の関係
対 1 の関係
上記の例の オブジェクトを使用して、 Person
が 1 つのDog
を持つことができる場合を考えてみましょう。 Person
モデルには、 Dog
オブジェクトへの任意リンクであるdog
プロパティを追加できます。 対 1 の関係は任意である必要があります。
class Dog: Object { true) var _id = ObjectId() (primaryKey: var name = "" var age = 0 } class Person: Object { true) var _id = ObjectId() (primaryKey: var name = "" // To-one relationship var dog: Dog? }
JSON Schema
App Services スキーマでは、新しい プロパティがフィールドdog
に変換されることがわかります。 フィールドは任意プロパティであるため、 required
配列にありません。 そのタイプは、別のDog
コレクション内の特定のDog
オブジェクトにリンクするobjectId
です。 ObjectIdは Dog
モデルのプライマリキーであるため、2 つのオブジェクトをリンクする フィールドになります。
{ "title": "Person", "bsonType": "object", "required": [ "_id" ], "properties": { "_id": { "bsonType": "objectId" }, "dog": { "bsonType": "objectId" }, "name": { "bsonType": "string" } } }
Dog
スキーマは変更されません。 これは 1 対 1 の関係であるため、一方向の関係になります。 Dog
はPerson
との関係がありません。
対多の関係
上記の例の オブジェクトを使用して、 Person
が多数の犬をしている可能性があるケースを考えてみましょう。 Dog
オブジェクトのリストであるdogs
プロパティをPerson
モデルに追加できます。 このユーザーが犬を持っていない場合、これは空のリストになります。 この人が犬を使い始めると、新しい犬オブジェクトを作成し、人のdogs
リストに追加できます。
class Dog: Object { true) var _id = ObjectId() (primaryKey: var name = "" var age = 0 } class Person: Object { true) var _id = ObjectId() (primaryKey: var name = "" // To-many relationship - a person can have many dogs var dogs: List<Dog> }
JSON Schema
App Services スキーマでは、新しい プロパティがフィールドdogs
に変換されることがわかります。 このフィールドの型は配列で、配列内の項目のタイプはobjectId
です。 これは、 Dog
モデルのプライマリキーをobjectId
として定義したためです。 このフィールドは、 Person
オブジェクトに関連するすべてのDog
オブジェクトのプライマリキーの配列です。
{ "title": "Person", "bsonType": "object", "required": [ "_id" ], "properties": { "_id": { "bsonType": "objectId" }, "name": { "bsonType": "string" }, "dogs": { "bsonType": "array", "items": { "bsonType": "objectId" } } } }
逆の関係
上記の例のオブジェクトを使用して、 Dog
オブジェクトがPerson
オブジェクトと逆の関係がある場合を考えてみましょう。
class Dog: Object { true) var _id = ObjectId() (primaryKey: var name = "" var age = 0 // The backlink to the `Person` who has this `Dog`. "dogs") var person: LinkingObjects<Person> (originProperty: } class Person: Object { true) var _id = ObjectId() (primaryKey: var name = "" // To-many relationship - a person can have many dogs var dogs: List<Dog> }
JSON Schema
App Services スキーマでは、 Dog
モデルのPerson
への逆関係を表すperson
プロパティが存在しないことがわかります。 逆の関係の値を直接設定することはできません。また、その関係は Atlas に存在しません。 ただし、 Realmオブジェクトモデルに基づいて、クライアント アプリケーション内でそれらの関係をRealmおよび更新します。
{ "title": "Dog", "bsonType": "object", "required": [ "_id" ], "properties": { "_id": { "bsonType": "objectId" }, "name": { "bsonType": "string" }, "age": { "bsonType": "long" } } }
埋め込みオブジェクトモデル
Realm Swift SDK を使用して埋め込みオブジェクトを定義すると、埋め込みオブジェクト から クラスが派生します。 関係を定義するのと同じ方法で、親オブジェクトタイプから埋め込みオブジェクトタイプを参照できます。
class Person: Object { true) var id = 0 (primaryKey: var name = "" // To-many relationship - a person can have many dogs var dogs: List<Dog> // Inverse relationship - a person can be a member of many clubs "members") var clubs: LinkingObjects<DogClub> (originProperty: // Embed a single object. // Embedded object properties must be marked optional. var address: Address? convenience init(name: String, address: Address) { self.init() self.name = name self.address = address } } class DogClub: Object { var name = "" var members: List<Person> // DogClub has an array of regional office addresses. // These are embedded objects. var regionalOfficeAddresses: List<Address> convenience init(name: String, addresses: [Address]) { self.init() self.name = name self.regionalOfficeAddresses.append(objectsIn: addresses) } } class Address: EmbeddedObject { var street: String? var city: String? var country: String? var postalCode: String? }
JSON Schema
埋め込みオブジェクトは、親型のスキーマ内の埋め込みドキュメントにマップされます。 この動作は、独自の MongoDB コレクションにマップされる通常の Realm オブジェクトとは異なります。
{ "title": "Person", "bsonType": "object", "required": ["id"], "properties": { "id": { "bsonType": "int" }, "name": { "bsonType": "string" }, "dogs": { "bsonType": "array", "items": { "bsonType": "objectId" } }, "address": { "title": "Address", "bsonType": "object", "properties": { "street": { "bsonType": "string" }, "city": { "bsonType": "string" }, "country": { "bsonType": "string" }, "postalCode": { "bsonType": "string" } } } } }
{ "title": "DogClub", "bsonType": "object", "required": ["_id", "name", "addresses"], "properties": { "_id": "objectId", "name": { "bsonType": "string" }, "members": { "bsonType": "array", "items": { "bsonType": "objectId" } }, "addresses": { "bsonType": "array", "items": { "title": "Address", "bsonType": "object", "properties": { "street": { "bsonType": "string" }, "city": { "bsonType": "string" }, "country": { "bsonType": "string" }, "postalCode": { "bsonType": "string" } } } } } }
オブジェクトモデルとスキーマの作成
Atlas で SDK オブジェクトモデルと BSON データ間でマッピングするには、 SDK オブジェクト モデル と一致する App Services のスキーマ が必要です。There are a few ways you can generate matching schema and object models:
クライアント アプリケーションでオブジェクトモデルを作成し、それらから App Services スキーマを生成します。
App Services でスキーマを作成し、そのスキーマから Realm オブジェクトモデルを生成します。
新しいクライアント アプリケーションを開発する場合は、クライアント アプリケーションのデータモデルを反復処理する必要があるかもしれません。 App Services で開発モードを有効にして、クライアント オブジェクト モデルに基づいてバックエンド 推論、スキーマの更新を行います。 開発モードはスキーマの重大な変更では機能しないため、SDK データモデルに重大な変更を加える場合は、サーバーから既存のスキーマを削除する必要があります。
Atlas にすでに存在するデータを操作するクライアント アプリケーションを開発する場合は、そのデータからスキーマを生成できます。 次に、サーバー側スキーマからSDK オブジェクトモデルを生成できます。