Firestore 聊天应用 - 构建消息主页

Firestore chat app - build messages home page

我有一个带有 Firestore RTDB 后端的 Flutter 聊天应用程序:

messages (collection)
    message_1 (document)
        chat (collection)
            chat_1 (document)
            chat_2 (document)
        users (array, document field)
            user_id_1 (String)
            user_id_2 (String)
        user_info (map to store user info, like name, avatar etc)
    message_2 (document)
        chat (collection)
            chat_1 (document)
            chat_2 (document)
        users (array, document field)
            user_id_1 (String)
            user_id_2 (String)
        user_info (map to store user info, like name, avatar etc)

我想创建一个主页,在其中显示用户参与的所有聊天,按最近排序,就像任何普通的聊天应用程序一样:

我知道如何显示用户参与的聊天。问题是,我不知道如何处理排序。有一种简单的方法可以做到这一点:每次发送新消息时,使用云函数并更新消息文档中名为 lastSent 的字段,然后在查询中执行 orderBy('lastSent', descending: true)。问题是,每次发送消息时,您都必须进行两次写入,而不是一次更新该字段。有没有更好的方法来处理这个问题?

注意:我的应用不仅仅是聊天应用,这只是主应用的一部分。想象一个类似于 Airbnb 的聊天功能,因此聊天消息的数量或频率可能不会像 Facebook Messenger 那样大

常见的解决方案是按照您的建议进行:在每个 "chat room" 的文档中存储一个 latest_updated 时间戳。

这确实意味着您需要进行两次写入而不是一次写入。但另一方面,您现在可以通过阅读 "chat room" 文档来确定正确的顺序,而不是阅读其下的个别消息。

请注意,虽然可以使用 Cloud Functions 执行此操作,但也可以直接从客户端执行此操作。您甚至可以捕捉到安全规则中的要求,即客户端只能写入新消息,如果他们还将相应 "chat room" 文档的 latest_updated 时间戳设置为与消息的时间戳相同的值,尽管这将产生为您添加的每条消息额外阅读一份文档的费用。