2017-06-05 306 views
1

我想進行一對一的聊天。每個用戶都可以聯繫其他用戶。Firebase一對一聊天Angular

JSON結構將是:

{ 
    "messages" : 
     "user1UID_user2UID" : { 
      auto generated ID : { 
         "text" : "hello", 
         "timestamp" : 192564646546, 
         "name" : "user1" 
      }, 
      auto generated ID : { 
         "text" : "hi", 
         "timestamp" : 192564646554, 
         "name" : "user2" 
      } 
     } 
} 

當用戶1連接到應用程序,他可以看到每一個,而他是其中的一部分談話的名單。 假設他已經發起了與用戶2的對話,並且用戶3也與他進行了對話。

所以,我們有以下孩子:

user1UID_user2UID

user3UID_user1UID

我怎樣才能檢索到所有用戶1參與到對話?

constructor(db: AngularFireDatabase) { 
    this.messages= db.list('/messages/' + user1UID + "_" + user2UID); //but I don't know user2UID at this moment 
} 

我可以做一個正則表達式,還是每次關注他時都必須存儲對話密鑰(某處)?

或者我完全錯了,我不看這個問題的正確方法?

回答

1

您使用的聊天室的關鍵命名架構是我的答案在這裏的變體:http://stackoverflow.com/questions/33540479/best-way-to-manage-chat-channels-in-firebase。這是一個變體,因爲你似乎沒有按照字典順序排列UID,這是我推薦的。

我所有的算法確實是產生一個可重複的,獨特的,冪等針對特定用戶之間的聊天房間的鑰匙。雖然這些對於數據模型來說非常重要,但它們並沒有神奇地解決其他用例。

由於經常在NoSQL數據建模的情況下,你必須對數據模型以適應你想要的用例。所以,如果您的應用程序,您需要顯示的聊天室每個用戶的列表中,那麼你應該在你的數據模型包括每個用戶的聊天室列表:

userChatRooms 
    user1UID 
    user1UID_user2UID 
    user1UID_user3UID 
    user2UID 
    user1UID_user2UID 
    user1UID_user3UID 
    user3UID 
    user1UID_user3UID 

現在得到了的聊天室列表用戶就像閱讀/userChatRooms/$uid一樣簡單。