2015-05-11 78 views
7

從我讀過的所有內容來看,似乎無法查詢多級別值。 我的數據結構如下所示:Firebase查詢孫輩/多級查詢

{ 
"dinosaurs": { 
    "bruhathkayosaurus": { 
     "meta":{ 
      "addedBy":"John", 
      "addedDate":"02021987" 
     }, 
     "appeared": -70000000, 
     "height": 25 
    }, 
    "lambeosaurus": { 
     "meta":{ 
      "addedBy":"Peter", 
      "addedDate":"12041987" 
     }, 
     "appeared": -76000000, 
     "height": 2.1 
    } 
} 
} 

不知道恐龍的鍵名,反正是有查詢元節點只獲取由John添加的項目。

在JS喜歡的東西:

var ref = new Firebase('test.firebaseio.com/dinosaurs'); 
    ref.orderByChild("meta/addedBy") 
    .equalTo('Peter') 
    .on("child_added", function(snapshot) { 
     console.log(snapshot); 
    }); 

有哈克解決方案,但沒有一個是可伸縮的,我應該扁平化這個數據?

編輯:

我需要一個代碼審查...這是一個可接受的解決方案嗎?

var ref = new Firebase('test.firebaseio.com/dinosaurs'); 
    ref.orderByChild("meta") 
    .on('child_added',function(snap1){ 
     snap1.ref().orderByChild("addedBy") 
     .equalTo("Peter") 
     .on('child_added', function(snap2) { 
      console.log(snap2.val()); 
     }) 
    }); 
+1

小心:當你有'開'時,你應該總是考慮何時發生相應的'關'。對於可以「當頁面/應用程序關閉時」的頂級''on's,但是'child_added'回調中的'on'會隨着時間的推移而導致聽衆的聚集。解決這個問題的常見方法是在循環中使用'once',但這通常也會導致次優性能。 –

+2

另請參閱:http://stackoverflow.com/questions/30151012/is-there-a-way-in-angularfire-to-query-for-matching-and-condition –

回答

5

查詢只能是1級深度。有許多解決方案,但是將數據展平並且鏈接/引用是一種選擇。

在上面的示例中,您可以創建另一個節點,將用戶名(父級)鏈接到他們添加的恐龍(孩子)。然後可以閱讀John節點並立即知道他添加了哪些恐龍。然後能夠訪問關於該dino的其他相關數據;出現的日期,高度等。

users 
    John 
    bruhathkayosaurus 
    Styracosaurus 
    Lambeosaurus 
    Spinosaurus 
    Peter 
    Lambeosaurus 
    Seismosaurus 

您可能想使用uid而不是名稱,但您明白了。

"dinosaurs": { 
    "bruhathkayosaurus": { 
     "addedBy":"John" 
     "addedDate":"02021987" 
     "appeared": -70000000 
     "height": 25 
    }, 

編輯2016年1月:

而且,爲什麼在列出的示例元節點,以便它可以被正是如此扁平的,目前還不清楚。由於這個答案,火力地堡擁有深厚的查詢,以便您可以查詢更深比1級。