データベースクエリのフィルタリング
このガイドで学べること
このガイドでは、レコードのフィルタリングされたクエリをデータベースにさせる方法を学びます。これはアプリで一般的に行われるタスクです。たとえば、特定の投稿に関連するコメントのみを表示したい場合や、未読のメッセージをすべて表示したい場合などです。これは、データベースにクエリを実行して、選択された結果のみをフィルタリングするように依頼することで実現されます。
Noodlでは、フィルタリングされたクエリを作成するためにクエリレコードノードを使用します。
概要
このガイドでは、以下のステップを説明します:
- 特定の値に等しいプロパティを持つレコードのデータベースクエリ
- 動的フィルタリングを行う、つまりクエリフィルターを動的に変更する
このガイドを最大限に活用するには、クラウドバックエンドの設定、クラスとレコードの作成、基本的なクエリの実行方法に既に慣れていることが 最適です。以下のガイドを通じて、それをすばやく学ぶことができます:
クラウド内のレコードのフィルタリング vs ローカルでのフィルタリング
このガイドでは、クラウドデータベース内のクエリをフィルタリングすることに焦点を当てています。つまり、レコードはアプリにネットワーク経由で送信される前にフィルタリングされます。これがクエリレコードノードが行うことです。
また、すでにアプリ内にあるデータをフィルタリングする別のノード、フィルタレコードもあります。つまり、ローカルでフィルタリングします。
これらの方法はそれぞれ利点と欠点があり、良いアプリではしばしばこ れらを組み合わせて使用します。
データベース内でクエリをフィルタリングする(クエリレコードを使用する)利点は次のとおりです:
-
ネットワークを介してフィルタリングされたレコードのみが送信されます。これは、大量のデータを扱う場合に非常に重要です。データベースに数千の製品がある場合、ユーザーが検索している製品のみを送信したいですし、そうでなければアプリが遅くなります。
-
例えば、特定のオブジェクトのみをソートまたはフィルタリングする場合に、データベースの最適化されたインデックスを利用できます。再び、数千または数百万のレコードを扱う大量のデータセットで作業する場合、これはアプリを高速にする鍵となります。
クエリをローカルでフィルタリングする(フィルタレコードを使用する)主な利点は次のとおりです:
-
レコードがアプリに一度入ると、ネットワーク経由でレコードを送信する必要がなくなり、アプリがはるかに高速になります。
-
アプリのユーザーが多い場合、バックエンドとデータベースが混雑する可能性があります。たとえば、データをローカルで処理することによって、クラウドデータベースへのクエリを頻繁に避けることで、それにかかる負荷を減らすことができます。
最適なソリューションは、しばしばこれら2つの方法を組み合わせることです。データベースに対してフィルタリングされたクエリを行い、アプリに送信されるレコードの量を合理的な数に絞り込み、その後でフィルタレコードを使用してローカルで追加のフィルタリングとソートを行います。
このガイドでは、クエリレコードノードを使用したフィル
タリングに特に焦点を当てています。フィルタレコードノードは非常に類似した方法で動作しますが、クエリレコードノードからのレコードの配列など、すでにアプリにあるレコードの配列にのみ作用します。
フィルタリングのためのクエリレコードノードの使用
このガイドでは、少なくとも1つのクラスがあり、いくつかのレコードを含むバックエンドがすでに稼働していることを前提としています。それに関するヘルプが必要な場合は、以前の「クラウドデータの操作」ガイドを参照してください。例として、以前のガイドで作成されたシンプルなタスクアプリを使用します。Taskという1つのクラスがあります。これには、タスクの説明であるtaskプロパティと、タスクが完了したかどうかを追跡するブール値isDoneプロパティがあります。

アプリのメイン画面は以下のようになります:

各todoレコードは以下のように構成されたリストアイテムによって表されます:

これで、未完了のタスクのみを表示するフィルターを追加したいと考えています。メイン画面のクエリレコードノードをクリックしてから、フィルタールールを追加ボタンをクリックします。

フィルターを構築できる新しいポップアップが表示されます。少し試してみてください。

基本的に3つの部分があります:
<プロパティ> <演算子> <値または入力>
<プロパティ>は、例えば私たちのタスク例のisDoneのように、レコードのプロパティです。
<演算子>は、条件の論理演算子です。さまざまな演算子があり、すべてのプロパティタイプですべての演算子が使用可能というわけではありません。
isDone - ブール値の場合、使用可能な演算子は等しい、等しくない、存在する、存在しないの4つです。等しい / 等しくないは自明ですが、存在する / 存在しない演算子は次のように機能します:プロパティに値が設定されているか、または未定義かどうかをチェックします。
最後に、<値または入力>は、演算子を適用する値です。<入力>オプションは後で見るので、今のところは<値>を使用しましょう。
このケースでは、isDone = falseである、つまりまだ完了していないタスクのみをフィルタリングしたいと考えています。したがって、私たちのフィルターは次のようになります:
<isDone> <等しい> <false>
それを選択しましょう。フィルターのやや難解な形式が、フィルターの下に自然言語で書き出されているのを見ることができます。

あなたのアプリのリストが未完了のタスクのみを表示するように変更されているのがすでに見えるはずです(あなたがそれを持っている場合)。タスクをチェックすると、それらが1つずつ消えていくのが見えるはずです。それらを戻したい場合は、ダッシュボードに行ってisDone値を再びfalseに変更し、アプリをリフレッシュする必要があります。

動的フィルタリング
アプリの現在の状態は明らかに欠陥があります - すべてのタスクを完了すると何も表示されません。完了したタスクと未完了のタスクのビューを切り替えることができる必要があります。
ラジオボタングループと2つのラジオボタンを追加しましょう。これにより、未完了のタスクを表示するか、完了
したタスクを表示するかを制御できます。


ボタンのラベルが正しく設定されていること("未完了を表示" / "完了を表示")、それぞれの値が"未完了" / "完了"に設定されていることを確認してください。また、ラジオボタングループの値は"未完了"になっています。これがデフォルトの状態になります。ラジオボタングループの値の出力を使用して、クエリレコードのフィルタ設定を制御します。
クエリレコードノードのフィルタ ーを入力を使用して制御できるように更新しましょう。クエリレコードノードをクリックして、フィルターの最後の部分を値ではなく入力に変更します。

入力に"isDoneFilter"という名前を付けます。これで、クエリレコードに新しい入力が使用できるようになりました!入力がtrueに設定されている場合、完了したタスク(isDone = true)のみがフィルタリングされ、falseの場合はその逆になります。
最後に、2つのラジオボタンの値"未完了"と"完了"をtrueまたはfalseに変換する必要があります。これは、式ノードを作成し、式を
filterState === "Completed"
と設定することで行います。式ノードの出力は、入力が"完了"の場合はtrue、それ以外の場合はfalseになります。最後に、式の出力をクエリレコードに接続します - そして、ラジオボタンをクリックするとフィルタリングが切り替わります。

