関係と埋め込みオブジェクト - React Native SDK
1 対 1 の関係
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 対多の関係とは、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 が適用されることが予想されます。
特定の自動車を製造しているメーカーを見つけるには、次の手順に従います。
呼び出し
linkingObjects()
パラメータとしてメーカークラス名と "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 によって自動的に削除されます。 親オブジェクトを削除した後にアプリケーションが保持する必要があるオブジェクトは、代わりに関係を使用する必要があります。
Realm オブジェクトモデル
埋め込みオブジェクトを定義するには、 embedded
をtrue
に設定します。 関係を定義するのと同じ方法で、親オブジェクトタイプから埋め込みオブジェクトタイプを参照できます。
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', }, }; }
重要
埋め込みオブジェクトにはプライマリキーを設定できません。