2017-06-05 263 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一样简单。