【问题标题】:Managing unread messages in firebase chat在 Firebase 聊天中管理未读消息
【发布时间】:2014-03-25 01:33:56
【问题描述】:

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

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

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

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

目前,根据this,(我可以在不检索实际儿童数据的情况下计算某个位置的儿童数量吗?)和this我正在尝试通过事务管理每个房间的未读消息计数,并在何时重置计数看过。但这是非常棘手的部分,我很好奇,我们这里有什么推荐的方法,可以减少工作量吗?

【问题讨论】:

    标签: firebase angularfire


    【解决方案1】:

    看来你已经回答得差不多了。 Firebase 中没有 WHERE 子句,解决方法是使用 snap.numChildren() 作为 FAQ 状态,或者使用计数器作为第二个链接状态。

    如果您仍然要获取聊天消息,或者是一对一聊天,总有效负载将是 100 KB 或更少(大约 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());
    });
    

    【讨论】:

    • 嘿@Kato,关于如何跟踪用户阅读了多少条消息有什么建议吗?我假设我将这 3 个计数器存储在房间本身中,作为每个用户阅读的消息总数和消息数。虽然我不知道如何检测用户是否阅读了消息。
    • 我建议只保留用户最后一次访问房间的时间戳,并为此后收到的消息保留query。这应该可以扩展到数千个。如果您的聊天室有数百万条消息(提示:他们没有),您可以通过使用 gmail 方法获得更多里程,并且只抓取最多 1k 条消息并说出“1000 条或更多未读消息”之类的内容
    • 是的,这是有道理的,我不必以这种方式维护计数器,并且使用 firebase 存在系统它非常快。谢谢@加藤
    • 您必须查询他们离开房间的时间而不是他们访问后的时间,对吗?否则,您将把他们在房间里阅读的那些消息算作未读。
    • 这种方法的唯一问题是它必须在“每次聊天”的基础上完成。理论上,这个查询必须为许多聊天运行(检查你的 WhatsApp/Telegram 应用程序,你可能有超过 80-100 个聊天),所以这必须在数据库中运行 80-100 个聊天,对吧?有没有更有效的方法?
    【解决方案2】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 2011-11-16
    • 1970-01-01
    • 2020-09-10
    相关资源
    最近更新 更多