2016-04-12 66 views
0

我試圖使用swift對Firebase集合進行查詢。查詢Firebase中的嵌套元素

我的收藏是這樣的:

{ 
    "networks" : { 
    "-KF9zQYGA1r_JiFam8gd" : { 
     "category" : "friends", 
     "members" : { 
     "facebook:10154023600052295" : true 
     }, 
     "name" : "My friends", 
     "owner" : "facebook:10154023600052295", 
     "picture" : "https://my.img/img.png" 
    }, 
    "-KF9zQYZX6p_ra34DTGh" : { 
     "category" : "friends", 
     "members" : { 
     "tototata" : true 
     }, 
     "name" : "My friends2", 
     "owner" : "facebook:10154023600052295", 
     "picture" : "https://my.img/img.png" 
    } 
    } 

和我的查詢是這樣的:

let networksRef = ref.childByAppendingPath("networks") 
        .queryOrderedByChild("members") 
        .queryEqualToValue(true, childKey: uid) 

然後我填充一個TableView中使用FirebaseUI。

let networksRef = ref.childByAppendingPath("networks") 
        .queryOrderedByChild("members") 
        .queryStartingAtValue(true, childKey: uid) 
        .queryEndingAtValue(true, childKey: uid) 

而且是明確的「流體」是嵌套在與「成員」節點名稱:

的事情是,查詢不返回任何內容,我也使用這種查詢的嘗試真正的價值。 (如圖所示)

由於要下載的數據量不同,我無法獲取所有沒有過濾的節點。

我卡在那一天,我快瘋了.. :-)

如果有人能幫忙嗎?

+0

我剛剛根據要求更新了問題。 – poms32

+0

清理註釋。 –

回答

2

正確的語法是:

let networksRef = ref.childByAppendingPath("networks") 
        .queryOrderedByChild("members/\(uid)") 
        .queryEqualToValue(true) 

但請注意,你需要一個指標爲每個UID爲這對提高工作效率:如果沒有這些指標

{ 
    "rules": { 
    "networks": { 
     ".indexOn": ["facebook:10154023600052295", "tototata"] 
    } 
    } 
} 

,在火力地堡客戶端下載所有數據並在本地進行過濾。結果將是相同的,但它會消耗大量不需要的帶寬。

一個適當的解決方案需要你改變你的數據結構。在Firebase(以及大多數其他NoSQL數據庫)中,您最終會以應用程序想要訪問的方式建模數據。既然你正在尋找一個用戶的一部分的網絡,你應該存儲網絡每用戶:

"networks_per_uid": { 
    "facebook:10154023600052295": { 
    "-KF9zQYGA1r_JiFam8gd": true 
    }, 
    "tototata": { 
    "-KF9zQYZX6p_ra34DTGh": true 
    }, 
} 

添加這個所謂的索引數據結構被稱爲反規範化,並介紹了this blog postdocumentation on data structuring和這篇關於NoSQL data modeling的大文章。

+0

謝謝!不僅是爲了答案,而是爲了更好的方式來做到這一點! 我會嘗試以合適的方式對我的所有數據進行重新排序! – poms32

+0

@ frank-van-puffelen - 該索引是否真的需要「.indexOn」:[「Facebook:10154023600052295」,「tototata」]或將「.indexOn」:['members']達到相同的結果? –

+0

它需要位於您要搜索的媒體資源上。您正在使用用戶的UID搜索該屬性,因此這就是您需要索引的內容。正如我的答案所解釋的,這通常是根據您的需求使用錯誤的數據結構的結果。有關更長的解釋,請參閱http://stackoverflow.com/questions/40656589/firebase-query-if-child-of-child-contains-a-value –