2017-09-29 7 views
1

FirebaseとSwiftを使用してゲームアプリケーションを構築し、このようなデータを保存します。Firebaseの指定された子によるフィルタリングと並べ替え

players: { 
    "category": { 
     "playerId": { 
     name: "Joe", 
     score: 3 
     } 
    } 
} 

私はスコアに基づいて作成する必要がある2つのクエリがあります。

  • は、単一のカテゴリから上位5選手を取得します。
  • ゲームの上位100人のプレーヤー全体を取得します。

は私が

ref.child("players").child(category).queryOrdered(byChild: "score").queryLimited(toLast:5) 

を使用して、最初のクエリのためのデータを取得する問題はありません。しかし、私は2番目のクエリを考え出す問題を抱えています。これを効率的に行うにはどうすればよいですか?

+0

有効な質問のように思われるため、誰がこれを控除したのか不明です。私は反撃した。 –

+0

データベースの構造を変更することは可能ですか?構造を変更すると簡単にできると思います。 – 3stud1ant3

+0

はい、構造を変更できます。 –

答えて

0

2番目のクエリ(NoSQLデータベースでは非常に一般的です)を追加するには、追加のデータ構造を追加するか、両方のクエリを許可するように現在の構造を変更する必要があります。

後者は、いくつかの追加の合成プロパティを使用して、データを単一のフラットリストに変換することによって達成できます。例えば。

ref.child("players") 
    .queryOrdered(byChild: "category_score") 
    .queryStarting(atValue:"category1_") 
    .queryEnding(atValue("category1_~") 
    .queryLimited(toLast:5) 

と全体のトップ100のスコアで:

ref.child("players") 
    .queryOrdered(byChild: "score") 
    .queryLimited(toLast:100) 

のための新たな追加のプロパティcategorycategory_score

players: { 
    "playerId": { 
    category: "category1" 
    name: "Joe", 
    score: 3, 
    category_score: "category1_3" 
    } 
} 

、あなたが持つカテゴリのトップの得点を得ることができます詳細については、ここで私の答えを参照してください。Firebaseデータベースクエリは、単一のプロパティに対してのみ順序付け/フィルタリングできます。多くの場合、フィルタリングする値を単一の(合成)プロパティに結合することが可能です。このアプローチやその他のアプローチの例については、私の答えはこちら:http://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebaseを参照してください。

関連する問題