我正在将Firebase用于简单的聊天应用程序。我希望获取用户1和用户2的消息。我的数据库结构如下所示。
我正在使用queryOrdered来获取消息,但是它将使用发送者或接收者进行过滤。
Database.database().reference().child("Chats").queryOrdered(byChild: "receiver")
.queryEqual(toValue: "2WCS7T8dzzNOdhEtsa8jnlbhrl12")
.observe(.value, with: { snapshot in
})
但是使用此代码,我仅收到接收者的消息。我如何也可以接收发件人的消息。我可以使用AND条件查询发送者孩子吗?
答案 0 :(得分:-1)
当前的数据结构无法通过单个查询来获取特定用户发送和接收的消息。
Firebase数据库查询只能对单个属性进行排序/过滤。在许多情况下,可以将要过滤的值组合到单个(合成)属性中。
例如,您可以将发送方和接收方UID合并为一个属性"sender_receiver": "2WCS7T8dzzNOdhEtsa8jnlbhrl12_Sl91z...."
,然后查询该合并值。
有关此方法和其他方法的详细示例,请在此处查看我的答案:Query based on multiple where clauses in Firebase
但是对于大多数聊天应用程序,我建议创建一个对聊天室“房间” 建模的数据库结构。因此,与其将一整串的 all 消息存储起来,不如将消息存储在房间/线程中,这也是您在应用程序的UI中显示的内容。
"-RoomId1": {
"msg1": { ... },
"msg2": { ... }
}, "-RoomId2": {
"msg3": { ... },
"msg4": { ... }
}
这样,您就可以最直接地从数据库映射到屏幕上显示的内容。
有关命名“房间”的好方法,请参见Best way to manage Chat channels in Firebase
然后,您仍将为每个用户存储他们所属房间的映射,这对于确保访问权限也可能有用。