2016-05-31 105 views
0

來自Parse,我主要依靠containedIn查詢來收集正確的數據。在解析中,我可能有一個objectIds的數組,並用這些ID查詢所有對象。我期望在Firebase上實現同樣的效果。containedIn查詢Firebase

我明白平坦化數據非常重要,但我不明白這對問題有何幫助。假設我有一個聊天室,裏面有用戶列表。我收集這些數據,現在有一組用戶名。我現在想導航到數據庫中的用戶並檢索與此用戶名數組中的一個元素匹配的所有內容。我怎樣才能完成這樣的事情?

例如,在一個正式的火力地堡例如一組用戶:

{ 
    "users": { 
    "alovelace": { ... }, 
    "ghopper": { ... }, 
    "eclarke": { ... } 
    } 
} 

我想執行一個查詢下載以下用戶:

["alovelace", "eclarke"] 

雖然一般的答案是有幫助的,Swift中的答案是最好的。謝謝。

+0

從您的意見,我想你明白我的問題,但我做了一個例子,使其更清楚。 – Acoop

+0

用戶lovelace和eclarke之間的關係是什麼?即什麼使得這兩個用戶節點重要?加載節點非常簡單,但要了解爲什麼您希望對Firebase的結構至關重要。 – Jay

+0

一個例子是他們是聊天室的兩個成員。或者當前用戶正在關注他們。 – Acoop

回答

1

一個例子是他們是聊天室的兩個成員。或者當前用戶正在關注他們。

所以理論上用戶節點

users 
    alovelace 
     followed_by 
     bill: true 
     frank: true 
     in_chat_room: room_42 
     location: France 
    ghopper 
     followed_by 
     jay: true 
     in_chat_room: room_27 
     location: USA 
    eclarke 
     followed_by 
     frank: true 
     in_chat_room: room_42 
     location: Canada 

和一些聊天室

chat_rooms 
    room_27 
    ghopper: true 
    room_42 
    lovelace: true 
    eclarke: true 

要獲得用戶的詳細用戶節點在聊天室42(洛夫萊斯,eclarke)

let usersRef = self.myRootRef.childByAppendingPath("users") 

usersRef.queryOrderedByChild("in_chat_room").queryEqualToValue("room_42") 
    .observeEventType(.Value, withBlock: { snapshot in 
    for child in snapshot.children { 
     let location = child.value["location"] as! String 
     print(location) //prints France and Canada 
    } 
}) 

要獲得用戶Frank正在關注(lovela CE,eclarke):

let usersRef = self.myRootRef.childByAppendingPath("users") 

usersRef.queryOrderedByChild("followed_by/frank").queryEqualToValue(true) 
    .observeEventType(.Value, withBlock: { snapshot in 
    for child in snapshot.children { 
     let userName = child.key as String 
     print(userName) 
    } 
}) 

注意,使用用戶名作爲節點關鍵的通常是一個壞主意 - 他們應該用他們的UID存儲。

另外請注意,我們並沒有真正做任何與chat_rooms節點,但維持的關係,具有節點相互引用可觀察的變化等有用

編輯:

迴應評論,這裏的結構,爲每一位用戶表示他們遵循誰代替誰是跟隨用戶

users 
    alovelace 
     following_user 
     bill: true 
     frank: true 
     in_chat_room: room_42 
     location: France 

這種結構,alovelace是繼比爾和坦誠。

要得到所有用戶的下列坦率地說:

let usersRef = self.myRootRef.childByAppendingPath("users") 

usersRef.queryOrderedByChild("following_user/frank").queryEqualToValue(true) 
    .observeEventType(.Value, withBlock: { snapshot in 
    for child in snapshot.children { 
     let userName = child.key as String 
     print(userName) 
    } 
}) 
+0

這對我來說似乎有點凌亂。爲什麼用戶需要存儲所有其他正在關注他們的用戶?對於每個用戶來說,它是否更清潔(更簡單)來存儲他們關注的人?而不是'user - > [followedBy]'不應該是'user - > [following]'?你將如何重組數據以適應這種情況? – Acoop

+0

結構化數據的方式有很多種 - 您曾詢問過'當前用戶是否關注他們',因此我將其結構化以顯示用戶關注者是誰。你可以翻轉,並顯示一個用戶正在關注的人 - 或兩者兼而有之!看到我更新的答案。 – Jay

+0

感謝您繼續提供幫助。但我仍不明白如何下載following_user中包含的所有用戶配置文件。我不想收集所有跟隨Frank的用戶,而是希望收集following_user中包含的所有用戶。例如,創建一個可以返回bill和frank的查詢。 – Acoop