Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

関係と埋め込みオブジェクト - React Native SDK

項目一覧

  • 1 対 1 の関係
  • 1 対多の関係
  • 逆の関係
  • 逆関係プロパティを定義する
  • コード内のオブジェクトのリンクを見つける
  • 埋め込みオブジェクト
  • Realm オブジェクトモデル

1 対 1 の関係とは、あるオブジェクトが特定のタイプの最大 1 つの他のオブジェクトに関連していることを意味します。 1 対 1 の関係を定義するには、関連する Realm オブジェクトタイプとしてプロパティタイプを指定します。

この例では、 Manufacturerは単一のCarを作成できます。

class ToOneManufacturer extends Realm.Object {
_id!: BSON.ObjectId;
name!: string;
car?: Car;
static schema: Realm.ObjectSchema = {
name: 'ToOneManufacturer',
properties: {
_id: 'objectId',
name: 'string',
// A manufacturer that may have one Car object
car: 'Car?',
},
};
}
class Car extends Realm.Object {
_id!: BSON.ObjectId;
model!: string;
miles?: number;
static schema: Realm.ObjectSchema = {
name: 'Car',
properties: {
_id: 'objectId',
model: 'string',
miles: 'int?',
},
};
}

1 対多の関係とは、1 つのオブジェクトが複数のオブジェクトに関連付けられる可能性があることを意味します。 対多の関係を定義するには、タイプが、オブジェクト スキーマ内の関連する Realm オブジェクトタイプのリストまたは配列であるプロパティを指定します。

この例では、 Manufacturerが多数のCarモデルを作成する可能性があります。

class ToManyManufacturer extends Realm.Object {
_id!: BSON.ObjectId;
name!: string;
cars!: Realm.List<LinkedCar>;
static schema: Realm.ObjectSchema = {
name: 'ToManyManufacturer',
properties: {
_id: 'objectId',
name: 'string',
// A manufacturer's related LinkedCar objects
cars: 'LinkedCar[]',
},
};
}
class LinkedCar extends Realm.Object {
_id!: BSON.ObjectId;
model!: string;
miles?: number;
static schema: Realm.ObjectSchema = {
name: 'LinkedCar',
properties: {
_id: 'objectId',
model: 'string',
miles: 'int?',
// A car's related ToManyManufacturer objects
manufacturer: {
type: 'linkingObjects',
objectType: 'ToManyManufacturer',
property: 'cars',
},
},
};
}

逆の関係は、定義された 1 対多または 1 多の関係でオブジェクトを参照する他のオブジェクトにオブジェクトをリンクします。 関係定義はデフォルトで一方向であり、 オブジェクトのモデルでプロパティを逆の関係として明示的に定義する必要があります。

たとえば、「プロバイダーは多数の自動車を所有している」という対多の関係では、「自動車はメーカーに属している」という逆関係は自動的に作成されません。 オブジェクトモデルで逆の関係を指定しない場合は、別のクエリを実行して、自動車のメーカーを検索する必要があります。

linkingObjectsを使用して、オブジェクト スキーマ内のプロパティに逆関係を割り当てることができます。 これにより、通常のプロパティと同様に逆関係にアクセスできます。

linkingObjectsプロパティは特定の関係にバックリンクします。 バックリンクする関係を、関係のオブジェクトタイプとプロパティ名で指定します。

この例では、 ManufacturerInverseオブジェクトのcarsプロパティは、 CarInverseオブジェクトの Realm.Listと 対多の関係にあります。 これには、メーカーにリンクされているすべての自動車が含まれます。

CarInverseオブジェクトのmanufacturerプロパティは、この関係を反転させます。 manufacturerプロパティは、 carsプロパティに自動車オブジェクトを含むすべてのManufacturerInverseオブジェクトを参照するように自動的に更新されます。

class ManufacturerInverse extends Realm.Object {
_id!: BSON.ObjectId;
name!: string;
cars!: Realm.List<CarInverse>;
static schema: Realm.ObjectSchema = {
name: 'ManufacturerInverse',
properties: {
_id: 'objectId',
name: 'string',
// A manufacturer's related CarInverse objects
cars: 'CarInverse[]',
},
};
}
class CarInverse extends Realm.Object {
_id!: BSON.ObjectId;
model!: string;
manufacturer!: Realm.List<ManufacturerInverse>;
miles?: number;
static schema: Realm.ObjectSchema = {
name: 'CarInverse',
properties: {
_id: 'objectId',
model: 'string',
miles: 'int?',
// A car's related ManufacturerInverse objects
manufacturer: {
type: 'linkingObjects',
objectType: 'ManufacturerInverse',
property: 'cars',
},
},
};
}

オブジェクトのRealm.Object.linkingObjects()を呼び出すと、そのオブジェクトにリンクするすべてのオブジェクトを検索できます。 使用して複数のドキュメントを挿入できます。 これは、オブジェクト スキーマにプロパティを追加せずに、特定の関係のすべてのリンク オブジェクトにアクセスしたい場合に便利です。

この例では、タイプ「linkingObjects」のmanufacturerフィールドを持たないLinkedCarオブジェクトモデルがあります。 誰かが複数のメーカーと自動車オブジェクトを作成し、新しく作成された自動車を製造会社のcarsフィールドに追加します。

linkingObjects()メソッドを使用して自動車のメーカーを見つけることができます。 このメソッドは、自動車にリンクするオブジェクトの結果 コレクションを返します。 この例では、Intella のモデル化されたドライバーは 1 件のプロバイダーのみが作成しているため、そのメーカーの名前は nis が適用されることが予想されます。

特定の自動車を製造しているメーカーを見つけるには、次の手順に従います。

  1. 呼び出し linkingObjects()

  2. パラメータとしてメーカークラス名と "cs" フィールドを渡します

const getLinkedManufacturer = (car: LinkedCar): string => {
const manufacturer = car.linkingObjects<ToManyManufacturer>(
'ToManyManufacturer',
'cars',
)[0];
// Returns 'Nissan', as only one manufacturer is linked
// to this car object.
return manufacturer.name;
};

埋め込みオブジェクトは、特定のオブジェクトに関する複雑なデータをモデル化する特殊なタイプのRealm オブジェクトです。 埋め込みオブジェクトは関係と似ていますが、追加の制約が付与され、非正規化されたMongoDB document modelにより自然にマッピングされます。

Realm は、各埋め込みオブジェクトを単一の特定の親オブジェクト内のネストされたデータとして扱う一意の所有権の制約を強制します。 埋め込みオブジェクトは親オブジェクトのライフサイクルを継承し、独立した Realm オブジェクトとして存在することはできません。 つまり、埋め込みオブジェクトにはプライマリキーを持つことができず、親オブジェクトが削除されると Realm は埋め込みオブジェクトを自動的に削除します。

Tip

埋め込みオブジェクトタイプは再利用可能で、作成可能な

複数の親オブジェクトタイプで同じ埋め込みオブジェクトタイプを使用でき、オブジェクトを他の埋め込みオブジェクト内に埋め込むことができます。 また、埋め込みオブジェクトタイプを、独自の定義でオプションのプロパティとして再帰的に参照することもできます。

注意

Realm は埋め込みオブジェクトに段階的な削除を使用する

Realm オブジェクトを削除すると、そのオブジェクトが参照するすべての埋め込みオブジェクトが Realm によって自動的に削除されます。 親オブジェクトを削除した後にアプリケーションが保持する必要があるオブジェクトは、代わりに関係を使用する必要があります。

埋め込みオブジェクトを定義するには、 embeddedtrueに設定します。 関係を定義するのと同じ方法で、親オブジェクトタイプから埋め込みオブジェクトタイプを参照できます。

class Manufacturer extends Realm.Object {
_id!: BSON.ObjectId;
name!: string;
cars!: Realm.List<CarWithEmbed>;
warranties!: Realm.List<Warranty>;
static schema: Realm.ObjectSchema = {
name: 'Manufacturer',
properties: {
_id: 'objectId',
name: 'string',
cars: 'CarWithEmbed[]',
// Embed an array of objects
warranties: 'Warranty[]',
},
};
}
class CarWithEmbed extends Realm.Object {
_id!: BSON.ObjectId;
model!: string;
miles?: number;
warranty?: Warranty;
static schema: Realm.ObjectSchema = {
name: 'CarWithEmbed',
properties: {
_id: 'objectId',
model: 'string',
miles: 'int?',
// Embed one object
warranty: 'Warranty?',
},
};
}
class Warranty extends Realm.Object {
name!: string;
termLength!: number;
cost!: number;
static schema: Realm.ObjectSchema = {
name: 'Warranty',
embedded: true,
properties: {
name: 'string',
termLength: 'int',
cost: 'int',
},
};
}

重要

埋め込みオブジェクトにはプライマリキーを設定できません。

戻る

オブジェクトモデルを定義する