2016-12-05 1 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" 
     } 

    }, 
} 

을 그리고 내가 필요한 것은 특정 주자가 참여하는 종족의 인종 아이디의를 얻을 수에 대한 쿼리를 수행하는 것입니다.

예 : 주자 "aaaaaaaaaaaaaaa"를 검색하여이 경우 경주 567 및 568을 가져옵니다. 이렇게하려면 orderByChild이 충분하지 않습니다. 두 번째 레벨 하위에서 검색하고 있기 때문입니다.

+0

안녕하세요. 이 [link] (http://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebase)가 도움이 될 수 있습니다. –

답변

1

데이터베이스 모델을 변경해야합니다. map 대신 list (A)의 사용 :

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

이 솔루션은 나를 위해 완벽하게 작동합니다. 감사합니다! –

관련 문제