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

3
我有一个使用Firestore实时数据库作为后端的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)

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

enter image description here

我知道如何显示用户参与的聊天记录。问题是,我不知道如何处理排序。有一种简单的方法:每次发送新消息时,使用云函数更新消息文档中称为lastSent的字段,然后在查询中使用orderBy('lastSent', descending: true)。问题是,每次发送消息时,您需要进行两次写操作才能更新此字段,而不是一次。是否有更好的方法来处理这个问题?
注意:我的应用程序不仅仅是一个聊天应用程序,这只是主应用程序的一部分。想象一下类似于Airbnb的聊天功能,因此聊天消息的数量或频率可能不像Facebook Messenger那样大。

你有这个实现吗?如果有的话,能否分享一下,因为我也处于同样的情况。 - Jon Stark
是的,您需要什么?云函数更新最新字段吗? - Evan
我想展示最近聊天记录的列表,并根据最新的聊天来排序,同时我还想在该列表中显示最后一条消息和时间戳。我正在使用Flutter和Firestore。目前我能够展示最近聊天记录的列表,但只有用户的名字,并且列表是按字母顺序排序的。 - Jon Stark
我已经发送了电子邮件。 - Jon Stark
请问您能分享一下您的代码吗?我需要完全相同的东西。 - harunB10
1个回答

3
常见的解决方案就是你所提出的:在每个“聊天室”文档中存储一个latest_updated时间戳。这确实意味着您需要进行两次写入而不是一次。但另一方面,您现在可以通过仅阅读“聊天室”文档来确定正确的排序,而不必一遍遍地读取其中的单个消息。
请注意,虽然可以使用Cloud函数实现此操作,但也可以直接从客户端完成此操作。您甚至可以在安全规则中捕获要求,即只有在客户端将相应“聊天室”文档的latest_updated时间戳设置为与消息的时间戳相同的值时,才能编写新消息,尽管这将导致每个添加的消息都需要额外读取一个文档的成本。

我认为你的意思是“每条消息需要额外的一次文档写入(write)”,而不是读取(read)。 :) 除非你假设在加载聊天列表时使用latest_updated时间戳读取消息,那么就需要额外的一次读取和一次写入。 - brianbhsu
这是一个读取操作,因为安全规则必须get()该聊天室文档以检查其last_updated字段。 - Frank van Puffelen
啊,我以为你是指除了写消息之外还要更新latest_updated字段的额外写入。我的错。 - brianbhsu
没关系。在我记起为什么发表那个评论之前,我不得不思考很多次。 - Frank van Puffelen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接