2016-09-20 122 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