2016-08-17 20 views
1

基本的に、私のアプリにはupvoted/downvotedできる場所に基づいて投稿があります。 指定された地域にあり、過去24時間に作成されたトップ15の投票を返すクエリを作成する必要があります。 SQLのバックグラウンドから来て、JSON形式とFirebaseの注文やフィルタリングオプションでクエリに組み込まれているため、これを不必要に難しくしています。私はクライアント側のフィルタリングが非常に多くなる可能性が高いことを認識しているので、クライアント側のフィルタリングを最小限に抑えるために、JSONの構造とクエリの形式を尋ねています。これまでのところ、これは私のJSON形式は次のようになります。Firebaseのデータベース構造とクエリフォーマットのオプション

"posts" : { 

    "-KPFIsDbf3WUljWvBwi-" : { 

     "latitude" : 33.64114800203589, 
     "longitude" : -116.4236003651668, 
     "time" : 1.47129994542173E12, 
     "uid" : "wjXpBBJMBVPvRVG48fFkerAw6TD3", 
     "upvotes" : 0 
}, 

私はGeofireを使用してみましたが、残念ながら領域のみで照会する能力を持っているようだこと、そして私が掲示地域や時間によって照会したいので、(間他のもの)、Geofireを使用することはうまくスケールされません。ここで

+0

地域があらかじめわかっていますか?または、ユーザーの場所によって決定されますか? –

+0

クエリ領域には何でもかまいません –

答えて

0

は、私がGeoFireとFirebaseクエリの組み合わせを使用して、同様の設定でどうなるのかです:

ステップ1(保存):ポストを保存するとき、ランダムIDを使用して、最初のデータベースに保存します。次に、そのIDを取得し、GeoFireの場所を作成し、あなたの投稿IDを位置キーとして設定します。

ステップ2(照会):これは、2段階のクエリ

ステップ2aであろう:指定された領域内のすべてのGeoFire位置を取得します。これで、スナップショットからすべての場所のキーを取得し、それぞれに単一のデータイベントハンドラをアタッチできます。

ステップ2b:upvotesの数でポストオブジェクトのソートされた配列を維持する。シングルイベントリスナーのスナップショットでは、まずタイムスタンプをチェックして、過去24時間以内であるかどうかを確認します。次に、配列のカウントが15未満の場合は、適切な解析方法を使用して、ソートされた位置に投稿を追加します。すでに15の場合は、配列の最下位要素のうち最下位要素にupvotesが多いかどうかを確認する必要があります。そうでない場合は、置き換えるアレイの場所を見つける必要があります。 Geofireのすべてのスナップショットを解析し終えたら、過去24時間のポストをupvotesでソートします。

+0

このようなサウンドは機能します。私が心配している唯一の事は、ポストリストが成長するにつれてパフォーマンスです。私はすべての投稿を永遠に保存しているので、必然的にクライアントはより多くの投稿をフィルタリングしなければならないため、パフォーマンスは悪く悪くなります。この方法で問題に遭遇する前に処理できる投稿の総量は、おおよそどのくらいになると思いますか? (ユーザーが1回の投稿ごとにクエリを実行する最悪の場合を想定します)。ありがとう –

+0

IDを既に持っている場合、スナップショットをキャプチャするのはかなり速いです。私はそれが並べ替えられた配列の部分があることを考慮すると、1000のポストの近くになるとパフォーマンスの問題を引き起こし始めると言います。 GeoFireのクエリが何をしているのかを見て、すべてを1つのクエリにまとめようとします。私はあなたにすぐに戻ってきます。 –

+0

したがって、詳細を見てみると、このクエリに第3の制約を追加することは現実的ではないようです。 Geofireは、同じクエリで緯度と経度を行うために既に多くのことを行っています。残りはクライアント側で実装する必要があります。 –

関連する問題