2017-04-26 11 views
2

子ノードのキー上でFirebaseからデータをクエリすると、子ノード全体をダウンロードし、アプリケーション内のデータをフィルタリングするか、クエリ固有のデータをダウンロードしますか?つまり、フィルタリングされたデータFirebaseクエリの実装

String myUserId = getUid(); 
Query myTopPostsQuery = databaseReference.child("user-posts").child(myUserId).orderByChild("starCount"); 
myTopPostsQuery.addChildEventListener(new ChildEventListener() {}); 

myTopPostsQuerystarCountに応じてデータをソートし、私が受け取った後、私は、このデータは私のアプリ内でフィルタリングされているかどうかということを知りたいaddChildEventListener()でデータを受信したり、私のアプリのダウンロードのみフィルタリングされたデータになりますFirebaseから。

答えて

1

クエリでフィルタを使用すると、クライアント側で操作を実行せずにクエリ固有のデータをダウンロードします。

  • あなたは一度に一つの順序によって方法を使用することができます。 ことを覚えておいてください。同じクエリで複数回order-byメソッドを呼び出すと、エラーが発生します。

  • 複数の制限機能または範囲機能を組み合わせることができます。たとえば、startAt()メソッドとendAt()メソッドを組み合わせて、結果を指定された値の範囲に制限することができます。読み

その他の情報については取るhere

0

ここに貼り付けたコードに基づいて、クエリはデータベースパスuser-posts/<id>のすべての投稿を検索し、順序付けられた方法でフィルタがないことを意味します。しかし、依然として、あなたが照会しているパスの下で利用可能なすべての投稿を取り戻すことになります。 starCountフィールドを含む投稿のみを見つけることができるので、「セミフィルタ」にすることができます

最適なことは、必要なものを正確に取り戻すためにクエリ中にフィルタリングすることです。この投稿のリストが本当に大きいので、後でパフォーマンスに大きな問題が生じることを想像してみてください。

フィルタリング&の並べ替えについては、次のセクションを参照してください。

https://firebase.google.com/docs/database/admin/retrieve-data#orderbychild

それとは別に、あなたのクエリをスピードアップするためにuserIdフィールドにインデックスを追加することを検討してください。

1

既にフィルタリングされたデータを取得します。クエリを使用するときは、limitToLast(10)としましょう。これらの要素は10個だけです。これはあなたの場合でもorderByChild("starCount")で起こっています。 SnanpShotには、フィルタリングされた要素のみが見つかります。詳細はofficial docをご覧ください。

希望します。

関連する問題