Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

Device Sync によるモデルデータ - Swift SDK

項目一覧

  • Realm オブジェクトモデル
  • JSON Schema
  • Realm の関係
  • 対 1 の関係
  • 対多の関係
  • 逆の関係
  • 埋め込みオブジェクトモデル
  • オブジェクトモデルとスキーマの作成

Realm オブジェクトを定義するには、 Objectからクラスを派生します。 それぞれに定義したモデルは、MongoDB Atlas の独自のコレクションにマップされます。 この例では、 DogPersonの両方が MongoDB Atlas の個別のコレクションにマッピングされます。

class Dog: Object {
@Persisted(primaryKey: true) var _id = ObjectId()
@Persisted var name = ""
@Persisted var age = 0
}
class Person: Object {
@Persisted(primaryKey: true) var _id = ObjectId()
@Persisted var name = ""
}

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 オブジェクトに自動的にマッピングしません。

App Services の犬のスキーマ
{
"title": "Dog",
"bsonType": "object",
"required": [
"_id"
],
"properties": {
"_id": {
"bsonType": "objectId"
},
"name": {
"bsonType": "string"
},
"age": {
"bsonType": "long"
}
}
}
App Services の権限スキーマ
{
"title": "Person",
"bsonType": "object",
"required": [
"_id"
],
"properties": {
"_id": {
"bsonType": "objectId"
},
"name": {
"bsonType": "string"
}
}
}

上記の例の オブジェクトを使用して、 Personが 1 つのDogを持つことができる場合を考えてみましょう。 Personモデルには、 Dogオブジェクトへの任意リンクであるdogプロパティを追加できます。 対 1 の関係は任意である必要があります。

class Dog: Object {
@Persisted(primaryKey: true) var _id = ObjectId()
@Persisted var name = ""
@Persisted var age = 0
}
class Person: Object {
@Persisted(primaryKey: true) var _id = ObjectId()
@Persisted var name = ""
// To-one relationship
@Persisted var dog: Dog?
}

App Services スキーマでは、新しい プロパティがフィールドdogに変換されることがわかります。 フィールドは任意プロパティであるため、 required配列にありません。 そのタイプは、別のDogコレクション内の特定のDogオブジェクトにリンクするobjectIdです。 ObjectIdは Dog モデルのプライマリキーであるため、2 つのオブジェクトをリンクする フィールドになります。

ドキュメントと 1 の関係を持つ者
{
"title": "Person",
"bsonType": "object",
"required": [
"_id"
],
"properties": {
"_id": {
"bsonType": "objectId"
},
"dog": {
"bsonType": "objectId"
},
"name": {
"bsonType": "string"
}
}
}

Dogスキーマは変更されません。 これは 1 対 1 の関係であるため、一方向の関係になります。 DogPersonとの関係がありません。

Tip

以下も参照してください。

対 1 の関係の詳細については、「 対 1 の関係 」を参照してください

上記の例の オブジェクトを使用して、 Personが多数の犬をしている可能性があるケースを考えてみましょう。 DogオブジェクトのリストであるdogsプロパティをPersonモデルに追加できます。 このユーザーが犬を持っていない場合、これは空のリストになります。 この人が犬を使い始めると、新しい犬オブジェクトを作成し、人のdogsリストに追加できます。

class Dog: Object {
@Persisted(primaryKey: true) var _id = ObjectId()
@Persisted var name = ""
@Persisted var age = 0
}
class Person: Object {
@Persisted(primaryKey: true) var _id = ObjectId()
@Persisted var name = ""
// To-many relationship - a person can have many dogs
@Persisted var dogs: List<Dog>
}

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"
}
}
}
}

Tip

以下も参照してください。

対多の関係の詳細については、「 対多の関係 」を参照してください

上記の例のオブジェクトを使用して、 DogオブジェクトがPersonオブジェクトと逆の関係がある場合を考えてみましょう。

class Dog: Object {
@Persisted(primaryKey: true) var _id = ObjectId()
@Persisted var name = ""
@Persisted var age = 0
// The backlink to the `Person` who has this `Dog`.
@Persisted(originProperty: "dogs") var person: LinkingObjects<Person>
}
class Person: Object {
@Persisted(primaryKey: true) var _id = ObjectId()
@Persisted var name = ""
// To-many relationship - a person can have many dogs
@Persisted var dogs: List<Dog>
}

App Services スキーマでは、 DogモデルのPersonへの逆関係を表すpersonプロパティが存在しないことがわかります。 逆の関係の値を直接設定することはできません。また、その関係は Atlas に存在しません。 ただし、 Realmオブジェクトモデルに基づいて、クライアント アプリケーション内でそれらの関係をRealmおよび更新します。

人間と逆の関係を持つ犬
{
"title": "Dog",
"bsonType": "object",
"required": [
"_id"
],
"properties": {
"_id": {
"bsonType": "objectId"
},
"name": {
"bsonType": "string"
},
"age": {
"bsonType": "long"
}
}
}

Tip

以下も参照してください。

逆の関係の詳細については、「 逆の関係 」を参照してください

Realm Swift SDK を使用して埋め込みオブジェクトを定義すると、埋め込みオブジェクト から クラスが派生します。 関係を定義するのと同じ方法で、親オブジェクトタイプから埋め込みオブジェクトタイプを参照できます。

class Person: Object {
@Persisted(primaryKey: true) var id = 0
@Persisted var name = ""
// To-many relationship - a person can have many dogs
@Persisted var dogs: List<Dog>
// Inverse relationship - a person can be a member of many clubs
@Persisted(originProperty: "members") var clubs: LinkingObjects<DogClub>
// Embed a single object.
// Embedded object properties must be marked optional.
@Persisted var address: Address?
convenience init(name: String, address: Address) {
self.init()
self.name = name
self.address = address
}
}
class DogClub: Object {
@Persisted var name = ""
@Persisted var members: List<Person>
// DogClub has an array of regional office addresses.
// These are embedded objects.
@Persisted var regionalOfficeAddresses: List<Address>
convenience init(name: String, addresses: [Address]) {
self.init()
self.name = name
self.regionalOfficeAddresses.append(objectsIn: addresses)
}
}
class Address: EmbeddedObject {
@Persisted var street: String?
@Persisted var city: String?
@Persisted var country: String?
@Persisted var postalCode: String?
}

埋め込みオブジェクトは、親型のスキーマ内の埋め込みドキュメントにマップされます。 この動作は、独自の 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 オブジェクトモデルを生成できます。

戻る

オブジェクトモデルの変更