Firestore是否缓存查询结果?

时间:2019-06-20 17:49:29

标签: javascript firebase google-cloud-firestore

想象一下,我将对具有100个文档的特定集合进行查询。

我将使用query cursors每页显示20个结果。

如果我的用户从第1页开始,然后按Next按钮直到看到第5页,那么他将阅读所有100个文档。

问题

如果他再次按下从第5页回到第1页的Previous按钮,我将被收取180次读取的费用,还是Firestore有某种缓存时间段,它将在没有任何新读取的情况下返回相同的结果?

180 =第1至4页两次,第5页一次。

注意::我将在每个页面上分别触发一个get()的{​​{1}}方法。

我之所以这样问是因为,在pricing operations page中,有关于侦听查询结果的信息:

  

收听查询结果

     

Cloud Firestore允许您收听查询结果并在查询结果更改时获取实时更新。

     

当您收听查询结果时,每次在结果集中添加或更新文档时,您都要付费。当文档从结果集中删除时,由于文档已更改,也会向您收费。 (相反,删除文档后,您无需支付阅读费用。)

     

此外,如果侦听器断开连接超过30分钟(例如,如果用户离线),则将向您收取读取费用,就像您发出了全新的查询一样。

注意::我知道在这种情况下我没有设置监听器,但是我想知道我的情况下是否存在任何模拟行为。

1 个答案:

答案 0 :(得分:1)

由于您没有设置侦听器,因此对get()的每次调用都会从服务器获取最新消息,并对这些读取收取费用。有两种方法可以避免每次都要为新的读取付费:

  1. 使用query.onSnapshot(...)侦听器,该侦听器会随着数据的变化而不断更新。
  2. 使用query.get({source: "cache"})从本地缓存中获取。有关详细信息,请参见GetOptions

对于(2),如果缓存中没有数据,则get()将返回没有文档的快照,因此您要么需要跟踪已获取的页面,要么进行某种后备:

let snap = await q.get({source: "cache"});
if (snap.empty) {
  // cache didn't have anything, so try a fetch from server instead
  snap = await q.get();
}