我有一个带有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那样大。
答案 0 :(得分:2)
常见的解决方案是按照您的建议进行操作:将latest_updated
时间戳存储在每个“聊天室”的文档中。
这确实意味着您需要执行两次写入而不是一次写入。但是,另一方面,您现在只需阅读“聊天室”文档即可确定正确的排序方式,而无需阅读其中的单个消息。
请注意,尽管当然可以使用Cloud Functions进行此操作,但这也可以直接从客户端完成。您甚至可以满足安全规则中的要求,即如果客户端还将相应的“聊天室”文档的latest_updated
时间戳设置为与消息的时间戳相同的值,则该客户端只能写一条新消息。这会增加您为每条添加的消息阅读一份文档的费用。