2016-12-05 51 views
0

這是我在Stackoverflow上發佈的第一個問題,因爲這是我第一次在這裏找不到解決方案。如何通過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的查詢。

示例:搜索跑步者「aaaaaaaaaaaaaaa」,並在這種情況下獲得比賽567和568.爲此,orderByChild這不夠,因爲我正在通過二級子查找。

+0

嗨。這[鏈接](http://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebase)可能會有所幫助。 –

回答

1

您應該更改您的數據庫模型。使用的map代替list

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

這個解決方案對我來說非常完美,謝謝! –