从firebase中检索聊天系统的数据

时间:2015-12-25 16:57:41

标签: ionic-framework firebase

这是我的firebase数据 - enter image description here

我在每个用户下都存储了每条消息的副本 -

我有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'事件似乎采取不同的行动 - 见下图 - enter image description here 当我使用'value'时,我得到了所有的子对象,但是当我使用'child_added'时,我只得到了users1中的第一个孩子。 文档说明child_added是为每个初始孩子触发的(假设这意味着在添加新孩子之前存在的所有孩子) 我的理解是否正确?我期待得到相同的返回结果' value'和' child_added'

1 个答案:

答案 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下的user2user1_user2之间的消息分组。此节点用作"私人聊天室"在这两个用户之间:只要同一个两个用户聊天,他们的消息就会被添加到这个房间。

Q2)你正在做once('child_added'。这意味着您只是告诉Firebase仅触发child_added一次,然后停止触发它。如果您执行on('child_added',则会为每个initila子项及所有后续添加项启动