我在每个用户下都存储了每条消息的副本 -
我有2个问题。 -
Q1 - 用于以有序方式提取user1和user2之间的聊天消息的查询,以便可以在个人聊天窗口中显示 -
我写了以下内容 -
//refuser1 is firebase reference to "https://myapp.firebaseio.com/messages/user1"
var messages = [];
refuser1.orderByChild("from").equalTo("user1").once('value', function(s){
s.forEach(function(childsnap){
messages.push(s.val());
});
});
refuser1.orderByChild("from").equalTo("user2").once('value', function(s){
s.forEach(function(childsnap){
messages.push(s.val());
});
});
// Now messages array has all messages between user1 and user2 -
// add code to sort messages in array based on timestamp /
这是存储和检索个人一对一聊天数据的正确方法吗?
Q2 - 检索数据时,'值'和' child_added'事件似乎采取不同的行动 - 见下图 -
当我使用'value'
时,我得到了所有的子对象,但是当我使用'child_added'
时,我只得到了users1中的第一个孩子。
文档说明child_added是为每个初始孩子触发的(假设这意味着在添加新孩子之前存在的所有孩子)
我的理解是否正确?我期待得到相同的返回结果' value'和' child_added'
答案 0 :(得分:3)
Q1)在NoSQL数据库中,您通常必须以您希望的方式存储数据。如果您想按特定顺序获取特定用户之间的聊天消息,则应以这种方式存储它们。
chats
user1_user2
-K...c9
from: "user1"
message: "Hello message 1"
time: ""
-K...od
from: "user1"
message: "Hello message 2"
time: ""
-K...t8
from: "user2"
message: "Hello message 1"
time: ""
-K...c9
from: "user1"
message: "Hello message 1"
time: ""
-K...xb
from: "user2"
message: "Hello message 2"
time: ""
在上述结构中,我将节点user1
下的user2
和user1_user2
之间的消息分组。此节点用作"私人聊天室"在这两个用户之间:只要同一个两个用户聊天,他们的消息就会被添加到这个房间。
Q2)你正在做once('child_added'
。这意味着您只是告诉Firebase仅触发child_added
一次,然后停止触发它。如果您执行on('child_added'
,则会为每个initila子项及所有后续添加项启动 。