2017-03-23 8 views
1

Here's the full tree,하지만 아래에는 간단한 버전도 포함되어 있습니다.Firebase 쿼리 : 중첩 된 사전에서 주어진 값에 대한 모든 키를 반환하는 방법?

Survey: 
    DaysAvail: 
      Mon: 
       uid1 
       uid2 
      Tues: 
       .... 
    FitnessLevel 
      Beginner: 
       uid1 

내가 원하는 것은 uid를 반환하고 모든 부모를 반환하는 것입니다. 그래서, 에 의해 검색 uid1 월요일, 초급을 반환하고 싶습니다. 어떻게해야합니까? 다음은 현재 코드이지만, "beginner" "Monday"등과 같이 지정된 중첩 값에 대한 모든 uid를 반환합니다. 이는 비효율적이며 많은 반복 코드가 필요합니다.

let databaseRef = FIRDatabase.database().reference() 
     databaseRef.child("Survey").observe(.value, with: { 
     snapshot in 

      for childSnap in snapshot.children.allObjects { 

       let snap = childSnap as! FIRDataSnapshot 

       if let snapshotValue = snapshot.value as? NSDictionary, 
let snapVal = snapshotValue[snap.key] as? NSDictionary { 

let daysofWeek = snapshotValue.object(forKey: "DaysAvail") as! NSDictionary 


let availMonday = daysofWeek["Monday"] as! NSDictionary 

let mondayUID = availMonday.allKeys 

availMonday의 값은 :

{ 
    2x4hC66p3YYM5wTiXJINP5Hz0PK2 = 1; 
    LuA7dLLD4iPSkV5GNWJMEogAmwg1 = 1; 
    QEpyq9KRkrcoePkvQkJEnVOKxyE3 = 1; 
} 

mondayUID의 값 :

[2x4hC66p3YYM5wTiXJINP5Hz0PK2, LuA7dLLD4iPSkV5GNWJMEogAmwg1, 
QEpyq9KRkrcoePkvQkJEnVOKxyE3] 

의견이나 아이디어가 크게 감상 할 수있다!

+0

너는 할 수 없다. 구조가 너무 깊다. 데이터를 [denormalize] (https://firebase.googleblog.com/2013/04/denormalizing-your-data-is-normal.html)하거나 구조를 변경하여 쿼리를 수행 할 수 있도록해야합니다. 또한 초등을 반환하는 uid1과 월을 반환하는 uid를 구별 할 수있는 것은 무엇입니까? – Jay

답변

0

1. 재구성 데이터베이스

이미 UID의 값을 가지고 있기 때문에, 다음과 같은 데이터베이스 구조를 사용하는 것이 가장 좋은 것입니다 :

DaysAvail: 
     uid1: Monday 
     uid2: Tuesday 
     uid3: Friday 

2.보다 구체적인 전화 걸기를

위의 구조를 사용하면 O (1) 시간에 전화를 걸 수 있습니다.

체크 아웃 Firebase Queries 필요

FIRDatabase.database().reference().databaseRef.child("DaysAvail").child(uid1).observe(.value, with: { 
    snapshot in 
}) 

3. 중포 기지를 조회합니다. 위 구조로 특정 날짜에 사용 가능한 모든 uid를 검색 할 수 있습니다. 예를 들어 월요일에 사용할 수있는 모든 uid를 검색 할 수 있습니다.