Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

Realm オブジェクトモデルの定義 - React Native SDK

項目一覧

  • オブジェクトタイプの定義
  • サポートされているプロパティの型
  • オブジェクト プロパティを定義する
  • 任意プロパティを宣言する
  • プライマリキーの宣言
  • プロパティのインデックス作成
  • 全文検索インデックスの設定
  • デフォルトのプロパティ値の設定
  • プロパティを再マッピングする
  • 非対称オブジェクトの定義
  • 非構造化データの定義
  • Typescriptと必要なプロパティ

Realm オブジェクトタイプを定義するには、 Realm.Objectを拡張するクラスを作成します。 型のnamepropertiesschemaという静的プロパティで定義します。 タイプ名は、Realm 内のオブジェクトタイプ間で一意である必要があります。

class Book extends Realm.Object {
static schema = {
name: 'Book',
properties: {
name: {type: 'string', indexed: true},
price: 'int?',
},
};
}
class Book extends Realm.Object<Book> {
name!: string;
price?: number;
static schema: ObjectSchema = {
name: 'Book',
properties: {
name: {type: 'string', indexed: true},
price: 'int?',
},
};
}

次に、Realm を開くときにクラス自体を構成オブジェクトのスキーマ プロパティに渡すことができます。

Realm オブジェクト内のすべてのプロパティには、厳密に定義されたデータ型があります。 プロパティの型は、プリミティブ データ型または同じ Realm で定義されたオブジェクト型にすることができます。 また、 型は、プロパティに単一の値が含まれているか、値のリストが含まれているかを指定します。

プリミティブ値型のリストがフィールドに含まれていることを指定するには、型名に[]を追加します。

サポートされているプロパティ タイプのリストについては、「プロパティ タイプ 」を参照してください。

オブジェクトタイプのプロパティを定義するには、 propertiesフィールドの下にプロパティの名前とデータ型を表すキーと値のペアを作成します。

次のスキーマでは、 _id makemodelmilesのこれらのプロパティを持つCar型を定義します。

プロパティを任意としてマークするには、オブジェクト構文を使用してoptionaltrueに設定します。 簡略化された構文を使用することもできます。たとえば、 型に疑問符?を追加します。 これは基本型に最適です。 より複雑なタイプには、より具体的なオブジェクト構文を使用する必要があります。

クラスの次の例では、Person プロパティとage birthdayプロパティは両方とも任意です。

class Person extends Realm.Object<Person> {
name!: string;
age?: number;
birthday?: Date;
static schema: ObjectSchema = {
name: 'Person',
properties: {
name: 'string',
age: {
type: 'int',
optional: true,
},
// You can use a simplified syntax instead. For
// more complicated types, use the object syntax.
birthday: 'date?',
},
};
}

オブジェクトタイプのプライマリキーとしてプロパティを指定するには、スキーマのprimaryKeyフィールドをプロパティ名に設定します。

注意

プライマリキーは、オブジェクトを一意に識別するプロパティです。 Realm はプライマリキー プロパティを自動的にインデックス化します。これにより、プライマリキーに基づいてオブジェクトを効率的に読み取り、変更できます。

オブジェクトタイプにプライマリキーがある場合、そのタイプのすべてのオブジェクトには、Realm 内の同じタイプのオブジェクト間で一意の 値を持つプライマリキー プロパティが含まれている必要があります。 オブジェクトタイプには、プライマリキーを 1 つだけ含めることができます。 オブジェクトタイプのプライマリキー プロパティは、そのタイプのオブジェクトが Realm に追加された後は変更できず、オブジェクトのプライマリキー値を変更することはできません。

Taskクラスの次の例では、 _idプロパティをプライマリキーとして指定しています。

1class Task extends Realm.Object {
2 static schema = {
3 name: 'Task',
4 properties: {
5 _id: 'int',
6 name: 'string',
7 priority: 'int?',
8 progressMinutes: 'int?',
9 assignee: 'Person?',
10 },
11 primaryKey: '_id',
12 };
13}
1class Task extends Realm.Object<Task> {
2 _id!: number;
3 name!: string;
4 priority?: number;
5 progressMinutes?: number;
6 assignee?: Person;
7 age?: number;
8
9 static schema: ObjectSchema = {
10 name: 'Task',
11 properties: {
12 _id: 'int',
13 name: 'string',
14 priority: 'int?',
15 progressMinutes: 'int',
16 assignee: 'Person?',
17 },
18 primaryKey: '_id',
19 };
20}

特定のプロパティに基づいて読み取り操作を頻繁に実行する場合は、プロパティをインデックスしてパフォーマンスを最適化できます。 Realmは、 string 、整数、ブール値、DateUUIDObjectId プロパティのインデックス作成をサポートしています。

注意

インデックスにより、特定の読み取り操作の速度が大幅に向上しますが、書込み時間が若干遅くなり、ストレージとメモリのオーバーヘッドが増加します。 Realm はインデックスをディスクに保存するため、Realm ファイルが大きくなります。 各インデックスエントリは 12 バイト以上です。 インデックス エントリの順序付けは、効率的な等価一致と範囲ベースのクエリ操作をサポートします。

特定のプロパティをインデックス化するには、プロパティのindexedフィールドをtrueに設定します。

Bookクラスの次の例では、 nameプロパティにインデックスを定義しています。

1class Book extends Realm.Object {
2 static schema = {
3 name: 'Book',
4 properties: {
5 name: {type: 'string', indexed: true},
6 price: 'int?',
7 },
8 };
9}
1class Book extends Realm.Object<Book> {
2 name!: string;
3 price?: number;
4
5 static schema: ObjectSchema = {
6 name: 'Book',
7 properties: {
8 name: {type: 'string', indexed: true},
9 price: 'int?',
10 },
11 };
12}

標準インデックスに加えて、Realm は string プロパティの全文検索(FTS)インデックスもサポートしています。 標準インデックスの有無にかかわらず string フィールドをクエリできますが、FTS インデックスを使用すると複数の単語とフレーズを検索し、その他を除外できます。

FTS インデックスのクエリの詳細については、「全文検索でのフィルタリング 」を参照してください。

FTS インデックスを作成するには、インデックス付きタイプを'full-text'に設定します。 これにより、プロパティに対する全文クエリが可能になります。 次の例では、 nameプロパティのインデックス付きタイプを'full-text'に設定します。

class Book extends Realm.Object<Book> {
name!: string;
price?: number;
static schema: ObjectSchema = {
name: 'Book',
properties: {
name: {type: 'string', indexed: 'full-text'},
price: 'int?',
},
};
}

デフォルト値を定義するには、プロパティの値をtypeフィールドとdefaultフィールドを持つオブジェクトに設定します。

Carクラスの次の例では、デフォルト値が0であるmilesプロパティを定義しています。

バージョン 11.1.0 の新機能

Realm.js v11.1.0では 以降では、以下の例のtimestampプロパティのように、関数を使用して動的なデフォルト値を定義できます。

1class Car extends Realm.Object {
2 static schema = {
3 name: 'Car',
4 properties: {
5 make: 'string',
6 model: 'string',
7 miles: {type: 'int', default: 0},
8 timestamp: {
9 type: 'int',
10 default: () => Math.round(new Date().getTime() / 1000),
11 },
12 },
13 };
14}
1class Car extends Realm.Object {
2 make!: string;
3 model!: string;
4 miles: number = 0;
5 timestamp: number = Math.round(new Date().getTime() / 1000);
6
7 static schema: ObjectSchema = {
8 name: 'Car',
9 properties: {
10 make: 'string',
11 model: 'string',
12 miles: {type: 'int', default: 0},
13 timestamp: {
14 type: 'int',
15 default: () => Math.round(new Date().getTime() / 1000),
16 },
17 },
18 };
19}

Realm に保存されているものとは異なるプロパティ名をコード内で使用するには、コードに表示されるプロパティの名前にmapToを設定します。

Employeeクラスの次の例では、 first_nameプロパティをfirstNameに再マッピングしています。

1class Employee extends Realm.Object {
2 static schema = {
3 name: 'Employee',
4 properties: {
5 _id: 'string',
6 first_name: {type: 'string', mapTo: 'firstName'},
7 },
8 primaryKey: '_id',
9 };
10}
1class Employee extends Realm.Object {
2 _id!: string;
3 first_name!: string;
4
5 static schema: ObjectSchema = {
6 name: 'Employee',
7 properties: {
8 _id: 'string',
9 first_name: {type: 'string', mapTo: 'firstName'},
10 },
11 primaryKey: '_id',
12 };
13}

Flexible Sync を使用していて、デバイスから Atlas データベースにコレクションを一方向に同期する必要がある場合は、オブジェクト スキーマにasymmetricプロパティを設定できます。

class WeatherSensor extends Realm.Object {
static schema = {
name: 'WeatherSensor',
// sync WeatherSensor objects one way from your device
// to your Atlas database.
asymmetric: true,
primaryKey: '_id',
properties: {
_id: 'objectId',
deviceId: 'string',
temperatureInFahrenheit: 'int',
barometricPressureInHg: 'float',
windSpeedInMph: 'float',
},
};
}
class WeatherSensor extends Realm.Object<WeatherSensor> {
_id!: Realm.BSON.ObjectId;
deviceId!: string;
temperatureInFahrenheit!: number;
barometricPressureInHg!: number;
windSpeedInMph!: number;
static schema: ObjectSchema = {
name: 'WeatherSensor',
// sync WeatherSensor objects one way from your device
// to your Atlas database.
asymmetric: true,
primaryKey: '_id',
properties: {
_id: 'objectId',
deviceId: 'string',
temperatureInFahrenheit: 'int',
barometricPressureInHg: 'float',
windSpeedInMph: 'float',
},
};
}

バージョンrealm@12.2.1で変更されました

JavaScript SDK バージョン 12.2.0 以前では、非対称オブジェクトから Realm.Object 型へのリンクはできません。 SDK バージョン 12.2.1 以降では、非対称オブジェクトは埋め込みオブジェクトに加えてRealm.Objectタイプにリンクできます。

注意

非対称オブジェクトの読み取り試行

非対称オブジェクトは読み取れません。 非対称オブジェクトをクエリしようとすると、「エラー: 非対称クラスをクエリできません。」というエラーが表示されます。

Data Ingest の詳細については、「 Atlas へのストリーム データ 」を参照してください。

バージョンrealm@12.9.0の新機能

JavaScript SDK バージョン 12.9.0 以降、 mixedプロパティ内に混合データのコレクションを保存できます。 この機能を使用すると、厳密なデータモデルを定義することなく、JSON や MongoDB ドキュメントなどの複雑なデータ構造をモデル化できます。

非構造化データとは、期待されるスキーマに簡単に準拠していないデータであるため、個々のデータ クラスにモデル化するのが困難または非効率的です。 たとえば、アプリには、実行時に構造が不明な高度に変数データや動的データがある場合があります。

コレクションを混合プロパティに保存すると、Device Sync を使用する際のパフォーマンス的な同期など、機能を犠牲にすることなく柔軟性が高まります。 そして、混合されていないコレクションと同じ方法でそれらを操作できます。

  • 混合コレクションは最大100レベルまでネストできます。

  • 混合コレクションのReactに対応する と をクエリできます。

  • 個々の混合コレクション要素を検索して更新できます。

ただし、混合コレクションにデータを保存する場合、構造化スキーマを使用したり、JSON string を単一の string プロパティに直列化したりする場合よりパフォーマンスが低くなります。

アプリで非構造化データをモデル化するには、スキーマ内の適切なプロパティを混合型 として定義します。 次に、これらのmixedプロパティを混合要素のリストまたは辞書コレクションとして設定できます。 mixedプロパティにはセットまたは埋め込みオブジェクトを保持できないことに注意してください。

Tip

  • 型が不明であるが、各値には一意の識別子が付けられる場合は、混合データ型のマップを使用します。

  • 型が不明であるが、オブジェクトの順序に意味がある場合は、混合データ型のリストを使用します。

Realm.create() を使用して Realm オブジェクトを作成すること を推奨しますが、オブジェクトモデルのクラスにnew 演算子を使用することもできます。

newを使用する場合は、 Realm.Objectを拡張するときに、クラスをジェネリックとして追加する必要があります。 これにより、必須フィールドが定義されていない場合の型エラーを含む、オブジェクトモデルの完全なTypescriptサポートが可能になります。

class Book extends Realm.Object<Book, 'name' | 'store'> {
name!: string;
store!: string;
price?: number;
static schema: ObjectSchema = {
name: 'Book',
properties: {
name: {type: 'string', indexed: true},
store: 'string',
price: 'int?',
},
};
}

戻る

モデルデータ