想象一下,我将对具有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分钟(例如,如果用户离线),则将向您收取读取费用,就像您发出了全新的查询一样。
注意::我知道在这种情况下我没有设置监听器,但是我想知道我的情况下是否存在任何模拟行为。
答案 0 :(得分:1)
由于您没有设置侦听器,因此对get()
的每次调用都会从服务器获取最新消息,并对这些读取收取费用。有两种方法可以避免每次都要为新的读取付费:
query.onSnapshot(...)
侦听器,该侦听器会随着数据的变化而不断更新。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();
}