Firestore,仅从集合中获取客户端缓存中不存在的那些文档

时间:2019-05-23 07:54:29

标签: firebase react-native google-cloud-firestore

我正在使用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)

最后,我将这两个查询返回的文档合并到一个数组中,以呈现在一个平面列表中。

1 个答案:

答案 0 :(得分:1)

为了知道特定线程/文档是否已更新,服务器将必须读取该文档,这是您要避免的收费操作。

唯一可行的解​​决方法是让客户端跟踪上次联机的时间,然后查询自那时以来修改过的文档。但是,如果要同时显示现有文档和新文档,则必须是单独的查询,这意味着它最终将位于缓存的单独区域中。因此,在这种情况下,您必须在Firestore的基础上设置自己的脱机存储,这比我通常愿意做的工作还要多。