Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

関係と埋め込みオブジェクト - Node.js SDK

項目一覧

  • 対 1 の関係
  • 対多の関係
  • 逆の関係
  • 逆にリンクされたオブジェクトを動的に取得する
  • 埋め込みオブジェクト
  • Realm オブジェクトモデル
  • JSON Schema

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 は、関連オブジェクトを追加または削除するたびに、暗黙的な関係を自動的に更新します。

アプリケーションは次のオブジェクト スキーマを使用して次のことを示すことができます。

  1. Manufacturerは多くのCarモデルを作成できます。

  2. 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 オブジェクトモデルが埋め込みオブジェクトを定義することを指定するには、 embeddedtrueに設定します。 関係を定義する際と同様に、親オブジェクトタイプから埋め込みオブジェクトタイプを参照します。

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

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

戻る

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