2016-09-20 11 views
1

クエリは、大きなアイテムをクライアントに同期するのに適した小さな番号にフィルタリングするために使用できます。
ページネーシングも同じ目的を果たします。つまり、アイテムをクライアントが取り出すのに適した小さな番号に制限することです。Firebaseクエリとページネーミングの組み合わせ

次のデータベーススキーマを考えてみましょう:

"users": { 
    "-KRyXWjI0X6UvffIB_Gc": { 
     "active": true, 
     "name": "John Doe", 
     "occupation": "Looking for firebase answer" 
    }, 
    "-KRyXBWwaK112OWGw5fa": { 
     "active": false, 
     "name": "Jane Doe", 
     "occupation": "Still stuck on combining query and pagination" 
    }, 
    "-KRyWfOg7Nj59qtoCG30": { 
     "active": true, 
     "name": "Johnnie Doe", 
     "occupation": "There is no greater sorrow than to recall in misery the time when we were stuck" 
    } 
} 

私はすべてのアクティブユーザーを取得した場合、それはこのようになります:(スウィフト内のコード)は、フィルタリング後

let usersRef = ref.child("users"); 
let query = usersRef.queryOrderedByChild("active") 
        .queryEqualToValue(true) 

を、それは10,000人のユーザーと私を残しました。同時にすべてのユーザーを取得することは問題になりません。それは改ページされなければならない。

ページ分割を行うには、のキー以外の一意のソート値でクエリを実行する必要があります。これは、今どのように見えるかです:

let usersRef = ref.child("users"); 
let query = usersRef.queryOrderedByChild("active") 
        .queryEqualToValue(true) 

let usersPerPage = 10; 
query.queryOrderedByKey() 
    .queryStartingAtValue(lastKey) 
    .queryLimitedToFirst(usersPerPage) 

ので、これは動作しません:あなたは一度に一桁ずつメソッドを使用することができます

。同じクエリで メソッドを複数回呼び出すと、エラーが発生します。

私はこの状況をどう解決すればいいか考えて2日間過ごした後、私はこの「ベストプラクティス」の解決策を考え出すことができます。

データベーススキーマを変更しました。 アクティブブール値を文字列に変換し、それをキーの後ろに追加して、キーに注文重要度コントロールを与えます。これは、今どのように見えるかです:

"users": { 
    "-KRyXWjI0X6UvffIB_Gc": { 
     "key_active": "-KRyXWjI0X6UvffIB_Gc true" 
     "active": true, 
     "name": "John Doe", 
     "occupation": "Looking for firebase answer" 
    } 
} 

今、私は改ページと単一ORDERBYを使用してクエリの両方を行うことができます:

let usersPerPage = 10; 
query.queryOrderedByChild("key_active") 
    .queryStartingAtValue("\(lastKey) true") 
    .queryLimitedToFirst(usersPerPage) 

どういうわけか私の脳は、内部キーを持つという考えを拒否しますキーです。なぜなら、それは最悪の汚い解決策であるからです。私はこの特定の状況のた​​めの正しい解決策を知りたい、どんな解決策も大いに評価されるだろう。

+0

基本的に一度に10人のユーザーしか検索しないようにしたいですか? – Dravidian

+0

アクティブユーザーは一度に10人です。それは正解です。 –

答えて

0

ちょうどあなたのJSONツリーにこれを追加: - :、Retrieving 5 user's at a time要件に応じて変更 - これはちょうどこの答えに従う

active_Users :{ 
     uid1 : { 
      index : 1, 
      name : "John Doe" 
       }, 
     uid2 : { 
      index : 2, 
      name : "Johnnie Doe" 
     } 
} 

後。

注: -この回答のユーザー/投稿の合計数は、子供数をカウントすることによって取得されています。あなたの重いデータベースを考えると、別のノードにtotalNoOfUserを格納し、新しいユーザーが追加されるたびに増分したいと思うかもしれません。

+0

質問をよくお読みください。アクティブなユーザーのみが返されます。また、インデックスの増分は良くありません。データベース内のデータは、クライアントの待ち時間がクライアント間で異なるため、クライアントがインデックスをインクリメントするまでに変更されている可能性があります。これにより、新しいデータが古いデータより古くなるという問題が発生します。 IDを保存するのは古いSQLのアプローチです。 JSONタイプのDBを使用しているので、タイムスタンプと乱数から生成されたアルファベットキー(ベース64エンコード)を使用する方が良いでしょう。また、Firebase(キー自体)ではすでにサポートされています。 –

+0

'active_Users'はまったく別のノードであり、そのuidがアクティブモードと非アクティブモードの間で切り替わるたびに、そのノードにuidを追加または削除します。 – Dravidian

+0

変更できるデータについては、クラウド機能でトランザクションを使用できます:https://firebase.google.com/docs/database/admin/save-data#section-transactions – Diego

関連する問題