我正在使用Firestore实现一个一对一的聊天应用程序,其中有一个名为chat
的集合,这样集合中的每个文档都是一个不同的thread
。
当用户打开应用程序时,屏幕应显示该用户的所有线程/会话,包括具有新消息的线程/会话(就像在whatsapp中一样)。显然,一种方法是从chat
集合中获取与此用户相关联的所有文档。
但是,这似乎是一个非常昂贵的操作,因为用户可能只有很少的更新线程(带有新消息的线程),但是我必须获取所有线程。
有没有一种优化且成本更低的方法来执行相同的操作,其中仅获取那些具有新消息的线程,或者更确切地说是用户设备缓存中不存在的线程(新创建或修改的线程)。
chat
集合中的每个文档都具有以下字段:
senderID: (id of the user who have initiated the thread/conversation)
receiverID: (id of the other user in the conversation)
messages: [],
lastMsgTime: (timestamp of last message in this thread)
当前要加载某个用户的所有线程,我正在应用以下查询:
const userID = firebase.auth().currentUser.uid
firebase.firestore().collection('chat').where('senderId', '==', userID)
firebase.firestore().collection('chat').where('receiverId', '==', userID)
最后,我将这两个查询返回的文档合并到一个数组中,以呈现在一个平面列表中。
答案 0 :(得分:1)
为了知道特定线程/文档是否已更新,服务器将必须读取该文档,这是您要避免的收费操作。
唯一可行的解决方法是让客户端跟踪上次联机的时间,然后查询自那时以来修改过的文档。但是,如果要同时显示现有文档和新文档,则必须是单独的查询,这意味着它最终将位于缓存的单独区域中。因此,在这种情况下,您必须在Firestore的基础上设置自己的脱机存储,这比我通常愿意做的工作还要多。