firebase从firestore js sdk缓存检索文档是否收费 我使用的是firebase JS SDK,已启用。这将自动在JS SDK中缓存检索到的文档 我执行以下查询: //一次 firebase.firestore().doc('path/to/doc').get() //两次 firebase.firestore().doc('path/to/doc').get() 我的问题是: 如果启用了脱机持久性,Firebase会向我收取两次读取的费用吗。因为我相信第二次读取将来自离线缓存,而无需进行网络调用 禁用脱机持久性时,Firebase会向我收取一次或两次费用吗 我的用例
用户通过客户端的“任务”打开web应用程序。firebase从firestore js sdk缓存检索文档是否收费 我使用的是firebase JS SDK,已启用。这将自动在JS SDK中缓存检索到的文档 我执行以下查询: //一次 firebase.firestore().doc('path/to/doc').get() //两次 firebase.firestore().doc('path/to/doc').get() 我的问题是: 如果启用了脱机持久性,Firebase会向我收取两次读取的费用吗。因为我相信第二次读取将来自离线缓存,而无需进行网络调用 禁用脱机持久性时,Firebase会向我收取一次或两次费用吗 我的用例,firebase,google-cloud-firestore,Firebase,Google Cloud Firestore,用户通过客户端的“任务”打开web应用程序。 每个任务都有一个带有文档引用的客户机字段 检索所有任务(例如500次读取) 每个任务检索每个客户机文档(即使某些客户机相同,也要读取500次) 因此如果只有20个客户端,我宁愿在用户打开应用程序时只有520次读取,而不是1000次读取 重新设计我的数据结构,将相关的客户机信息保存在任务本身而不是引用上,是更好,还是Firebase JS SDK足够聪明,不会重复检索刚刚检索到的同一个文档 PS:我在这里发现了一个类似的问题: 但它没有我想要的确切
每个任务都有一个带有文档引用的
客户机字段
检索所有任务(例如500次读取)
每个任务检索每个客户机文档(即使某些客户机相同,也要读取500次)
因此如果只有20个客户端,我宁愿在用户打开应用程序时只有520次读取,而不是1000次读取
重新设计我的数据结构,将相关的客户机信息保存在任务本身而不是引用上,是更好,还是Firebase JS SDK足够聪明,不会重复检索刚刚检索到的同一个文档
PS:我在这里发现了一个类似的问题:
但它没有我想要的确切信息
firebase从firestore js sdk缓存检索文档是否收费
不,没有。如果从本地缓存执行读取,则不会将其作为服务器端读取进行收费
但是您的代码有两个get
调用:
在这种情况下,Firestore客户端无法知道文档是否在这两次调用之间发生了更改。因此,它必须调用服务器来确定文档是否已更改,这是(或至少可能是)付费读取
如果您需要知道应用程序中多个位置的文档的当前状态,并且这些位置彼此靠近(按时间计算),则应在该文档上保留一个onSnapshot
侦听器。这可以确保本地缓存始终以最低的成本保持最新。我所描述的“用例”如何?我将侦听器设置为检索500个任务,并需要将客户端文档保存为每个任务的引用。(例如,forEach(taskDoc=>taskDoc.clientRef.get())
)即使有许多重复的引用,总共只有20个客户端,这是否会作为500次额外读取收费?如果执行500次get()
操作,则需要从服务器读取500次。但是如果您为每个唯一的客户端添加一个侦听器,您可以确保您拥有20个侦听器和读取的最新数据。那么您的意思是说如果我这样做:firestore.firebase().collection('tasks/data').onSnapshot(querySnapshot=>querySnapshot.forEach(doc=>doc.data().clientRef.get())
并且我的onSnapshot检索500个任务,这500个任务都执行doc.data().clientRef.get()
,那么我将被收取1000次读取(500+500)的费用,而不管某些clientRef是否相同?(如果你能在回答中添加此问题的答案,我将标记为正确!很抱歉问了这么多,我想让你明白)每个get()
都必须检查服务器上的文档是否是最新的,因此对get()
的500次调用是500次读取。我在回答和上面的评论中都说过。
// once
firebase.firestore().doc('path/to/doc').get()
// twice
firebase.firestore().doc('path/to/doc').get()