2016-09-20 95 views
2

我嘗試使用firebase和angular構建一對一聊天應用程序。我正在使用firebase文檔推薦的結構,但我在數據檢索方面遇到了麻煩。Firebase一對一聊天應用程序結構並按價值獲得子女

{ 
    "chats" : { 
    "one" : { 
     "lastMessage" : "test" 
    } 
    }, 
    "members" : { 
    "one" : { 
     "rebel" : true, 
     "redboy" : true 
    } 
    }, 
    "messages" : { 
    "one" : { 
     "-KS1R6b-1TdVASQL4tj7" : { 
     "createdAt" : 1474288450158, 
     "text" : "hgagagagaga", 
     "userId" : "rebel" 
     }, 
     "-KS1aZxqX3_PpjNdyiA7" : { 
     "createdAt" : 1474291191857, 
     "text" : "hhh", 
     "userId" : "redboy" 
     } 
    } 
    } 
} 

我應該如何通過firebase查詢獲取用戶'rebel'聊天。或者我應該在用戶的根目錄下存儲chatIds。

這種結構困惑我不WHERE條款

UPDATE:

如果我添加chatIds到用戶的根這個解決我的問題,但不知道它是真的還是假的。似乎是正確的方式

"users" : { 
    "rebel" : { 
     "age" : 3, 
     "chats" : { 
     "one" : true 
     }, 
     "name" : "rbl" 
    }, 
    "redboy" : { 
     "age" : 5, 
     "chats" : { 
     "one" : true 
     }, 
     "name" : "rb" 
    } 
    } 
+0

你已經在你的問題中包含了JSON樹的圖片。請用實際的JSON替換爲文本,您可以通過點擊Firebase數據庫控制檯中的導出按鈕輕鬆獲取。將JSON作爲文本可以搜索,使我們能夠輕鬆使用它來測試您的實際數據,並將其用於我們的答案中,並且通常只是一件好事。 –

+0

@FrankvanPuffelen你是對的我替換它 – cgrgcn

回答

2

當使用Firebase(以及大多數其他NoSQL解決方案)時,您會發現您經常需要針對應用程序要使用它的方式對數據建模。

您當前的數據結構允許您輕鬆找到特定聊天室的成員。

從技術上講,你可以查詢到找到聊天室特定成員:

ref.child('members').orderByChild('rebel').equalTo(true) 

但這需要你定義一個索引爲每個用戶,這不結垢(因爲你必須添加他們手動爲每個用戶):

{ 
    "rules": { 
    "members": { 
     ".indexOn": ["rebel", "redboy"] 
    } 
    } 
} 

最常見的解決方案是(如前所述)模型的數據,以允許您想要的查詢。既然你要找到每個用戶的聊天室,您應該擴大模型來存儲聊天室爲每個用戶:

"memberships" : { 
    "rebel" : { 
    "one": true 
    }, 
    "redboy" : { 
    "one" true 
    } 
}, 

正如你看到的,在這裏我們保持members指數。

現在你可以很容易地確定用戶反叛配有:

ref.child('memberships/rebel').on('child_added', ... 

我看到你添加了一個類似的結構,以你的問題。主要區別在於我將其添加爲頂級結構。這是Firebase的常見模式,因爲它可以更輕鬆地保護數據並僅檢索數據的一部分。

爲了讓這個事情更加舒適,我推薦這篇文章在NoSQL data modeling

+0

謝謝弗蘭克這是非常好的答案對我來說,我會加我的頂級,因爲你建議 – cgrgcn

+0

我有一個後續問題@FrankvanPuffelen,當用戶redboy想要發送消息給反叛? redboy會先創建一個新的聊天,然後將該聊天添加爲會員/反叛中的一個節點?這是正確的方法嗎?將所有這些邏輯放在客戶端應用程序中嗎? –

0

是的,你需要存儲的聊天ID的用戶的根目錄下與值true檢索所有的聊天記錄,隨後的消息。請遵循這個link