関係と埋め込みオブジェクト - Node.js SDK
対 1 の関係
1対 1 の関係とは、あるオブジェクトがオブジェクト スキーマ内の 1 つの他のオブジェクトのみに関連付けられていることを意味します。 1 対 1 の関係を定義するには、関連する Realm オブジェクトタイプとしてプロパティタイプを指定します。
例
アプリケーションは次のオブジェクト スキーマを使用して、 Manufacturer
が単一のCar
を作成できることを示すことができます。
class Manufacturer extends Realm.Object { static schema = { name: "Manufacturer", properties: { _id: "objectId", name: "string", // A manufacturer that may have one car car: "Car?", }, }; } class Car extends Realm.Object { static schema = { name: "Car", properties: { _id: "objectId", model: "string", miles: "int?", }, }; }
class Manufacturer extends Realm.Object { _id!: BSON.ObjectId; name!: string; car?: Car; static schema: ObjectSchema = { name: "Manufacturer", properties: { _id: "objectId", name: "string", // A manufacturer that may have one car car: "Car?", }, }; } class Car extends Realm.Object { _id!: BSON.ObjectId; model!: string; miles?: number; static schema: ObjectSchema = { name: "Car", properties: { _id: "objectId", model: "string", miles: "int?", }, }; }
対多の関係
対多の関係とは、オブジェクトが複数のオブジェクトに特定の方法で関連していることを意味します。 対多の関係を定義するには、タイプが、オブジェクト スキーマ内の関連する Realm オブジェクトタイプのリストまたは配列であるプロパティを指定します。
例
アプリケーションは次のオブジェクト スキーマを使用して、 Manufacturer
が多数のCar
モデルを作成できることを示すことができます。
class Manufacturer extends Realm.Object { static schema = { name: "Manufacturer", properties: { _id: "objectId", name: "string", // A manufacturer that may have many cars cars: "Car[]", }, }; } class Car extends Realm.Object { static schema = { name: "Car", properties: { _id: "objectId", model: "string", miles: "int?", }, }; }
class Manufacturer extends Realm.Object { _id!: BSON.ObjectId; name!: string; cars!: Realm.List<Car>; static schema: ObjectSchema = { name: "Manufacturer", properties: { _id: "objectId", name: "string", // A manufacturer that may have many cars cars: "Car[]", }, }; } class Car extends Realm.Object { _id!: BSON.ObjectId; model!: string; miles?: number; static schema: ObjectSchema = { name: "Car", properties: { _id: "objectId", model: "string", miles: "int?", }, }; }
逆の関係
逆の関係は、定義された 1 対多または 1 多の関係でオブジェクトを参照する他のオブジェクトにオブジェクトをリンクします。 関係定義はデフォルトで一方向であり、 オブジェクトのモデルでプロパティを逆の関係として明示的に定義する必要があります。
たとえば、「プロバイダーは多数の自動車を所有している」という対多の関係では、「自動車はメーカーに属している」という逆関係は自動的に作成されません。 オブジェクトモデルで逆の関係を指定しない場合は、別のクエリを実行して、自動車のメーカーを検索する必要があります。
逆の関係を定義するには、オブジェクトモデルでlinkingObjects
プロパティを定義します。 linkingObjects
は、反転する関係のオブジェクトタイプとプロパティ名を指定します。
逆関係プロパティの値を手動で設定することはできません。 Realm は、関連オブジェクトを追加または削除するたびに、暗黙的な関係を自動的に更新します。
例
アプリケーションは次のオブジェクト スキーマを使用して次のことを示すことができます。
Manufacturer
は多くのCar
モデルを作成できます。各
Car
は、それを作成するManufacturer
に自動的にリンクする必要があります。
Manufacturer
オブジェクトのcars
プロパティは、 Car
オブジェクトの Realm.Listとの 対多関係として定義されます。 これには、特定のメーカーの自動車がすべて含まれています。
Car
オブジェクトのmanufacturer
プロパティは、この関係を反転させます。 manufacturer
プロパティは、 cars
プロパティにCar
を含むすべてのManufacturer
オブジェクトを参照するように自動的に更新されます。
class Manufacturer extends Realm.Object { static schema = { name: "Manufacturer", properties: { _id: "objectId", name: "string", // A manufacturer that may have many cars cars: "Car[]", }, }; } class Car extends Realm.Object { static schema = { name: "Car", properties: { _id: "objectId", model: "string", miles: "int?", manufacturer: { type: "linkingObjects", objectType: "Manufacturer", property: "cars", }, }, }; }
class Manufacturer extends Realm.Object { _id!: BSON.ObjectId; name!: string; cars!: Realm.List<Car>; static schema: ObjectSchema = { name: "Manufacturer", properties: { _id: "objectId", name: "string", // A manufacturer that may have many cars cars: "Car[]", }, }; } class Car extends Realm.Object { _id!: BSON.ObjectId; model!: string; miles?: number; manufacturer!: Realm.Collection<Manufacturer>; static schema: ObjectSchema = { name: "Car", properties: { _id: "objectId", model: "string", miles: "int?", manufacturer: { type: "linkingObjects", objectType: "Manufacturer", property: "cars", }, }, }; }
逆にリンクされたオブジェクトを動的に取得する
You can dynamically retrieve an object with an inverse relationship without defining a linkingObjects
type in its schema. スキーマからlinkingObjects
型を削除すると、スキーマは標準的な対多の関係のようになります。 リンクされたオブジェクトを取得する必要がある場合は、 Realm.Object.linkingObjects() メソッドを クエリを実行します。
例
逆関係の例の次の継続では、 Car
スキーマからタイプ「linkingObjects」のmanufacturer
フィールドを削除しました。 アプリケーション開発者は複数の製品と自動車オブジェクトを作成し、アプリケーションは新しく作成された自動車を製品のcars
フィールドにプッシュします。
特定の自動車オブジェクトを作成するメーカーを検索するには、 .linkingObjects()
を呼び出して、"production" クラス名と "cs" フィールドをパラメーターとして渡します。
.linkingObjects()
メソッドは、プロパティが関係を逆にするオブジェクトの結果 コレクションを返します。 この例では、Intella のモデル化されたドライバーは 1 件のプロバイダーのみが作成しているため、そのメーカーの名前は nis が適用されることが予想されます。
const carObjects = realm.objects(Car); // Get the Manufacturer who makes the Car const linkedManufacturer = carObjects[0].linkingObjects( "Manufacturer", "cars" )[0]; expect(linkedManufacturer.name).toBe("Nissan");
const carObjects = realm.objects<Car>(Car); // Get the Manufacturer who makes the Car const linkedManufacturer: Manufacturer = carObjects[0].linkingObjects<Manufacturer>("Manufacturer", "cars")[0]; expect(linkedManufacturer.name).toBe("Nissan");
埋め込みオブジェクト
埋め込みオブジェクトは、複雑なデータをモデル化する特殊なタイプのRealm オブジェクトです。 また、 MongoDB document modelにもより自然にマッピングします。 埋め込みオブジェクトは関係と似ていますが、追加の制約があります。
Realm treats each embedded object as nested data inside of a parent object. 埋め込みオブジェクトは、親オブジェクトのライフサイクルを継承します。 独立した Realm オブジェクトとして存在することはできません。 つまり、埋め込みオブジェクトはプライマリキーを持つことができません。 Realm は、親オブジェクトが削除されると、埋め込みオブジェクトも自動的に削除します。
Tip
埋め込みオブジェクトタイプは再利用可能で、作成可能な
複数の親オブジェクトタイプで同じ埋め込みオブジェクトタイプを使用できます。 オブジェクトを他の埋め込みオブジェクトに埋め込むこともできます。 また、埋め込みオブジェクトタイプを、独自の定義でオプションのプロパティとして再帰的に参照することもできます。
Realm オブジェクトモデル
Realm オブジェクトモデルが埋め込みオブジェクトを定義することを指定するには、 embedded
をtrue
に設定します。 関係を定義する際と同様に、親オブジェクトタイプから埋め込みオブジェクトタイプを参照します。
class Manufacturer extends Realm.Object { static schema = { name: "Manufacturer", properties: { _id: "objectId", name: "string", cars: "Car[]", // Embed an array of objects warranties: "Warranty[]", }, }; } class Car extends Realm.Object { static schema = { name: "Car", properties: { _id: "objectId", model: "string", miles: "int?", // Embed one object warranty: "Warranty?", }, }; } class Warranty extends Realm.Object { static schema = { name: "Warranty", embedded: true, properties: { name: "string", termLength: "int", cost: "int", }, }; }
class Manufacturer extends Realm.Object { _id!: BSON.ObjectId; name!: string; cars!: Realm.List<Car>; warranties!: Realm.List<Warranty>; static schema: ObjectSchema = { name: "Manufacturer", properties: { _id: "objectId", name: "string", cars: "Car[]", // Embed an array of objects warranties: "Warranty[]", }, }; } class Car extends Realm.Object { _id!: BSON.ObjectId; model!: string; miles?: number; warranty?: Warranty; static schema: ObjectSchema = { name: "Car", 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: ObjectSchema = { name: "Warranty", embedded: true, properties: { name: "string", termLength: "int", cost: "int", }, }; }
JSON Schema
埋め込みオブジェクトは、親型のスキーマ内の埋め込みドキュメントにマップされます。 この動作は、独自の MongoDB コレクションにマップされる通常の Realm オブジェクトとは異なります。
{ "title": "Contact", "bsonType": "object", "required": ["_id"], "properties": { "_id": { "bsonType": "objectId" }, "name": { "bsonType": "string" }, "address": { "title": "Address", "bsonType": "object", "properties": { "street": { "bsonType": "string" }, "city": { "bsonType": "string" }, "country": { "bsonType": "string" }, "postalCode": { "bsonType": "string" } } } } }
{ "title": "Business", "bsonType": "object", "required": ["_id", "name"], "properties": { "_id": { "bsonType": "objectId" }, "name": { "bsonType": "string" }, "addresses": { "bsonType": "array", "items": { "title": "Address", "bsonType": "object", "properties": { "street": { "bsonType": "string" }, "city": { "bsonType": "string" }, "country": { "bsonType": "string" }, "postalCode": { "bsonType": "string" } } } } } }