Realm 内のデータをフィルタリングするには、 RQLを使用してクエリを構築します。 クエリは常にオブジェクトの最新の状態を反映し、データが変更されるたびにアプリを更新できる通知を発行します。
構文、使用、および制限の詳細については、 RQLリファレンスを参照してください。
結果コレクション
結果のコレクションは、クエリ操作に一致する Realm 内のすべてのオブジェクトを表します。 一般的に、通常の JavaScript 配列のようにコレクションを操作できますが、コレクションは実際にメモリ内に一致する Realm オブジェクトを保持しません。 代わりに、一致したオブジェクトを参照します。一致したオブジェクトは Realm ファイル内のデータに直接マップされます。
注意
ページ分割と制限
一部のクエリは、クエリに一致するすべてのオブジェクトのサブセットにのみアクセスする必要があります。 Realm の遅延読み込みコレクションは、実際にアクセスするときにのみオブジェクトを取得します。そのため、クエリ結果を制限するために特別なメカニズムは必要ありません。
たとえば、一度に一致するオブジェクトを 10 個のみ検索したい場合(ページ付きの製品カタログなど)、結果コレクションの 10 個の要素にアクセスできます。 次のページに進むには、前のページの最後の要素の直後に続くインデックスから、結果コレクションの次の 10 つの要素にアクセスします。
このページの例
このページの例では、タスク リスト アプリの単純なデータセットを使用しています。 Realm の 2 つのオブジェクトタイプは、 ProjectとTaskです。 Taskには、名前、割り当て者の名前、完了したフラグがあります。 また、優先順位(値が大きいほど重要)と、その作業に費やされた時間数もあります。 Projectには 0 個以上のTasksがあります。
これらの 2 つのクラス、 ProjectとTaskのスキーマを参照してください。
const TaskSchema = { name: "Task", properties: { name: "string", isComplete: "bool", priority: "int", progressMinutes: "int", assignee: "string?" } }; const ProjectSchema = { name: "Project", properties: { name: "string", tasks: "Task[]" } };
クエリを作成する
データをフィルタリングするには、 RQLで作成したクエリを Realm .Results.filtered() に渡します。
const items = realm.objects("Item"); // Gets all items where the 'priority' property is 7 or more. const importantItems = items.filtered("priority >= $0", 7);
全文検索でフィルタリング
RQL ( RQL )を使用して、全文検索(FTS)インデックスを持つプロパティをクエリできます。 FTS インデックス付きプロパティをクエリするには、フィルタリングされたクエリでTEXT述語を使用します。
単語の前にハイフン( - )文字を付けて、単語の結果を除外します。 たとえば、 swan -lakeを検索すると、 lakeを持つ検索結果を除くswanのすべての検索結果が含まれます。
次の例では、次のBookオブジェクトモデルを使用してBook.nameフィールドをクエリします。
class Book extends Realm.Object<Book> { name!: string; price?: number; static schema: ObjectSchema = { name: "Book", properties: { name: { type: "string", indexed: "full-text" }, price: "int?", }, }; }
// Retrieve book objects from realm const books = realm.objects(Book); // Filter for books with 'hunger' in the name const booksWithHunger = books.filtered("name TEXT $0", "hunger"); // Filter for books with 'swan' but not 'lake' in the name const booksWithSwanWithoutLake = books.filtered("name TEXT $0", "swan -lake");
全文検索トークナイザの詳細
全文検索(FTS)インデックスは以下をサポートします。
ブール値一致単語検索。関連性検索ではありません。
トークンは、発音区別符号を区別せず、大文字と小文字を区別しません。
ハイフン(
-)で区切られた単語はfull-textのように 2 つのトークンに分割されます。トークンは、ASCII と Atlas 1 の追加文字(西部言語)のみで構成できます。 他のすべての文字は空白と見なされます。
演算子
Realm コレクションをフィルタリングするために使用できる演算子にはいくつかのタイプがあります。 フィルターは、フィルタリングされるコレクション内のすべてのオブジェクトの演算子式を評価することで機能します。 式がtrueに解決される場合、Realm Database は結果コレクションにオブジェクトを含めます。
式は、次のいずれかで構成されます。
現在評価されているオブジェクトのプロパティの名前。
演算子と最大 2 つの引数式(s)。
リテラルの string、数値、または日付。
比較演算子
検索の最も簡単な操作は、値を比較することです。 RQLには、==、>、>=、in、<、<=、!= などの標準的な比較演算子があります。
比較演算子の詳細なドキュメントについては、 RQL比較演算子のリファレンスを参照してください。
次の例では、クエリ エンジンの比較演算子を使用して次のようにします。
priorityプロパティ値の値をしきい値と比較して、優先順位の高いタスクを見つけます。どの優先順位を超えると、優先順位が高いと見なされます。progressMinutesプロパティが特定の範囲内にあるかどうかを確認して、開始されたばかりのタスクまたは実行時間が短いタスクを見つけます。assigneeプロパティがnullに等しいタスクを見つけて、割り当てられていないタスクを見つけます。assigneeプロパティが名前のリストにあるかどうかを確認して、特定のチームメイト エイリアスまたはレイテンシに割り当てられたタスクを見つけます。
const highPriorityTasks = tasks.filtered("priority > $0", 5); const unassignedTasks = tasks.filtered("assignee == $0", null); const lowProgressTasks = tasks.filtered("$0 <= progressMinutes && progressMinutes < $1", 1, 10); const aliTasks = tasks.filtered("assignee == $0", "Ali"); console.log( `Number of high priority tasks: ${highPriorityTasks.length}`, `Number of unassigned tasks: ${unassignedTasks.length}`, `Number of just-started or short-running tasks: ${lowProgressTasks.length}`, `Number of tasks for Ali: ${aliTasks.length}` );
論理演算子
論理演算子を使用して複合述語を作成します。 RQLには、AND、OR、NOT などの標準論理演算子があります。
論理演算子に関する完全なドキュメントについては、 RQL論理演算子に関する参考資料を参照してください。
次の例では、 RQLの論理演算子を使用して、Atlas の完了したタスクをすべて検索します。 assigneeプロパティ値が 'Ali' に等しく、かつisCompleteプロパティ値がtrueであるすべてのタスクを検索します。
console.log( "Number of Ali's complete tasks: " + tasks.filtered("assignee == $0 && isComplete == $1", "Ali", true).length );
string演算子
== 、 beginsWith 、 contains 、 endsWithなどの string 演算子を使用して string 値を比較できます。 また、 LIKE演算子を使用して、正規表現のようなワイルドカードを検索することもできます。
string文字列演算子の完全なドキュメントについては、RQLstring 演算子 完全なドキュメントを参照してください。
次の例では、 RQLのstring演算子を使用して、名前が文字「e」で始まるプロジェクトと、名前に「ie」が含まれるプロジェクトを検索します。
// Use [c] for case-insensitivity. console.log( "Projects that start with 'e': " + projects.filtered("name BEGINSWITH[c] $0", 'e').length ); console.log( "Projects that contain 'ie': " + projects.filtered("name CONTAINS $0", 'ie').length );
集計演算子
コレクションを走査し、集計演算子を使用して単一の値に縮小します。
集計演算子の詳細なドキュメントについては、「 RQL集計演算子リファレンス 」を参照してください。
次の例では、集計演算子を使用してデータのさまざまなファセットを表示します。
@avg平均的なタスクの優先順位が 5 を超えるプロジェクトを表示します。@sum長時間実行されているプロジェクトを表示します。
console.log( "Number of projects with average tasks priority above 5: " + projects.filtered("tasks.@avg.priority > $0", 5).length ); console.log( "Number of long-running projects: " + projects.filtered("tasks.@sum.progressMinutes > $0", 120).length );
コレクション 演算子
コレクション演算子は、 ルールを使用して、オブジェクトの特定のリスト プロパティのすべての要素に特定の述語を適用し、各入力コレクション オブジェクトを出力コレクションに渡すかどうかを決定します。
コレクション演算子の完全なドキュメントについては、「 RQLコレクション演算子 のリファレンス 」を参照してください。
次の例では、 RQLのコレクション演算子を使用して次を検索します。
ALL完了したタスクがないプロジェクトの場合ANY最優先のタスクを持つプロジェクトの場合
console.log( "Number of projects with no complete tasks: " + projects.filtered("ALL tasks.isComplete == $0", false).length ); console.log( "Number of projects with any top priority tasks: " + projects.filtered("ANY tasks.priority == $0", 10).length );
概要
Realm .Results.filteredを使用して、 RQLにより Realm 内のデータをフィルタリングします。
RQLの詳細については、 RQLリファレンスを参照してください。
結果のフィルタリングに使用できる演算子のカテゴリはいくつかあります。-比較-論理-string-集計-セット