在firebase聊天中管理未读消息

时间:2014-03-25 01:33:56

标签: firebase angularfire

我正在建立实时聊天,与skype非常相似。我在客户端使用firebase作为后端和angularfire。 基本上,所有事情看起来都很清楚,但我还是坚持了一件事 - 显示未读消息的数量。

应用程序使用非常简单的Firebase设计:2个或更多用户可以在"房间中聊天" - 具有唯一名称的根集合。除文本之外的聊天消息可以包含"元数据" - 发件人ID,时间戳等

简单地说,我需要模拟这个伪代码:

room.messages.where({unread:true})。count()

现在,根据this,(我可以统计某个位置的孩子而不检索实际的子数据吗?)和this我试图管理每个房间的未读邮件数量通过交易和重置计数查看时。但这是非常棘手的部分,我很好奇,我们在这里有任何推荐的方法,这可以减少工作量吗?

2 个答案:

答案 0 :(得分:2)

看起来你几乎已经回答了这个问题。 Firebase中没有WHERE子句,解决方案是使用snap.numChildren()作为FAQ状态,或使用计数器作为第二个链接状态。

如果您要取消聊天消息,或者它是一对一聊天,其中总有效负载将是100千字节或更少(20个左右10kb消息),那么只需使用numChildren。如果消息有效负载相当大,则设置计数器。

所以你要维持一个反击:

  • 您的用户已阅读了多少条消息
  • 存在多少条消息
  • 差异是未读消息的数量

由于您的"消息存在"计数器将由多个用户同时更新,您可以使用事务来完成此操作而不会发生冲突:

new Firebase(URL_TO_COUNTER).transaction(function(currValue) {
    return (currValue||0)+1;
}, function(err, success, snap) {
    if( err ) { throw err; }
    console.log('counter updated to '+snap.val());
});

答案 1 :(得分:0)

不要重新发明轮子:) 包含代码示例的完整工作解决方案,包括Firebase团队的未读消息,网址为 https://firechat.firebaseapp.com