2017-03-23 5 views
1

Here's the full tree,しかし私は単純なバージョンも含めています。Firebaseのクエリ:ネストされた辞書の特定の値のすべてのキーを返す方法は?

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

私がしたいことは、uidの検索を返し、すべての親を返すことです。だから、 で検索する私は月曜日、初心者に戻したいと思います。これどうやってするの?ここに私の現在のコードはありますが、 "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

これはできません。構造が深すぎます。クエリを実行できるように、データを[非正規化](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)時間でコールを実行できます。

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

必要

アウトFirebase Queries 3. Firebaseクエリ。上記の構造では、特定の日に利用可能なすべてのuidを取得することができます。たとえば、月曜日に利用可能なすべてのUIDを取得することはできます。

関連する問題