Realm オブジェクトモデルの定義 - React Native SDK
項目一覧
オブジェクトタイプの定義
Realm オブジェクトタイプを定義するには、 Realm.Object
を拡張するクラスを作成します。 型のname
とproperties
をschema
という静的プロパティで定義します。 タイプ名は、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
make
、 model
、 miles
のこれらのプロパティを持つCar
型を定義します。
任意プロパティを宣言する
プロパティを任意としてマークするには、オブジェクト構文を使用してoptional
をtrue
に設定します。 簡略化された構文を使用することもできます。たとえば、 型に疑問符?
を追加します。 これは基本型に最適です。 より複雑なタイプには、より具体的なオブジェクト構文を使用する必要があります。
クラスの次の例では、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
プロパティをプライマリキーとして指定しています。
1 class 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 }
1 class 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 、整数、ブール値、Date
、UUID
、ObjectId
プロパティのインデックス作成をサポートしています。
注意
インデックスにより、特定の読み取り操作の速度が大幅に向上しますが、書込み時間が若干遅くなり、ストレージとメモリのオーバーヘッドが増加します。 Realm はインデックスをディスクに保存するため、Realm ファイルが大きくなります。 各インデックスエントリは 12 バイト以上です。 インデックス エントリの順序付けは、効率的な等価一致と範囲ベースのクエリ操作をサポートします。
特定のプロパティをインデックス化するには、プロパティのindexed
フィールドをtrue
に設定します。
Book
クラスの次の例では、 name
プロパティにインデックスを定義しています。
1 class Book extends Realm.Object { 2 static schema = { 3 name: 'Book', 4 properties: { 5 name: {type: 'string', indexed: true}, 6 price: 'int?', 7 }, 8 }; 9 }
1 class 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
プロパティのように、関数を使用して動的なデフォルト値を定義できます。
1 class 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 }
1 class 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
に再マッピングしています。
1 class 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 }
1 class 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
型が不明であるが、各値には一意の識別子が付けられる場合は、混合データ型のマップを使用します。
型が不明であるが、オブジェクトの順序に意味がある場合は、混合データ型のリストを使用します。
Typescriptと必要なプロパティ
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?', }, }; }