2016-12-05 8 views
0

これは、私がここで私の問題の解決策を見つけられないので、私がStackoverflowで投稿した最初の質問です。 Firebaseの子どものサブチャイルドによる照会方法は?

は、私はこのようなFirebaseデータベース構造でした:

{ "races" : { 
    567 : { 
     "distance" : 10 , 
     "date" : 1594124321 , 
     "runners" : { 
      1 : "aaaaaaaaaaaaaaa" , 
      2 : "gf76dsgf45dsag7" , 
      3 : "6f4565dsa4fa6s5" , 
      4 : "lh43k2l3kj2l4kj" , 
      5 : "lklk3f4545s7c93" 
     } 

    }, 
    568 : { 
     "distance" : 5 , 
     "date" : 1594135432 , 
     "runners" : { 
      1 : "faskj432lk5465f" , 
      2 : "aaaaaaaaaaaaaaa" , 
      3 : "6f4565fdsgds6s5" , 
      4 : "lh43gfdsaj2l4kj" 
     } 

    }, 
    569 : { 
     "distance" : 15 , 
     "date" : 1594138245 , 
     "runners" : { 
      1 : "kjhkj435kkjhkjh" , 
      2 : "gkl5lj4325dsag7" , 
      3 : "6ffsdaadsgds6s5" 
     } 

    }, 
} 

をそして私が必要なのは、特定のランナーが参加レースのレースIDを取得するためのクエリを実行することです。

例:私は2番目のレベルのsubchildで検索しています原因ランナーのための検索「aaaaaaaaaaaaaaa」、そしてこの場合にはこれを行うためのレース567と568を取得し、orderByChildそれは、enoughtではありません。

+0

こんにちは。この[リンク](http://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebase)が参考になるかもしれません。 –

答えて

1

データベースモデルを変更する必要があります。代わりにlistmapを使用します。

569 : { 
    "distance" : 15 , 
    "date" : 1594138245 , 
    "runners" : { 
     "kjhkj435kkjhkjh" : true , 
     "gkl5lj4325dsag7" : true , 
     "6ffsdaadsgds6s5" : true 
    } 

} 

Best Practices: Arrays in Firebaseを確認してください。

その後、あなたはこのようなQueryorderByChild方法を使用することができます。

Query query = FirebaseDatabase.getInstance().getReference("races") 
        .orderByChild("runners/" + userId).equalTo(true); 

最後に、あなたがValueEventListenerを追加し、レースのリストを取得することができます。

+1

朗読Victor。しかし、これにはメンテナンスの問題になるために、すべてのランナーにインデックスを追加する必要があります。データをモデリングするさらに別の方法を使って、よりスケーラブルなソリューションについては、http://stackoverflow.com/questions/40656589/firebase-query-if-child-of-child-contains-a-valueを参照してください。 :-) –

+0

このソリューションは、私にとって完璧に動作します、ありがとう! –

関連する問題