当我开始在 Firestore 中收听单个文档时,我是不是需要支付一次阅读费用,即使该文档没有更改?

Posted

技术标签:

【中文标题】当我开始在 Firestore 中收听单个文档时,我是不是需要支付一次阅读费用,即使该文档没有更改?【英文标题】:Do I pay one read when I start listening to a single document in Firestore, even if the doc has not changed?当我开始在 Firestore 中收听单个文档时,我是否需要支付一次阅读费用,即使该文档没有更改? 【发布时间】:2019-07-09 17:06:26 【问题描述】:

我知道,每当我打开 QUERY 的侦听器时,最低收费是一次读取,即使此查询不返回任何文档(因为没有适合查询的文档,甚至如果自上次打开此侦听器以来有但没有变化)。

根据documentation:

查询的最低费用 对于您执行的每个查询,即使查询未返回任何结果,也需要读取一份文档的最低费用。

Stream<QuerySnapshot> stream = Firestore().collection("someCollection").where("someField", isGreaterThan: 42).snapshots();
stream.listen((querySnapshot) => doSomething());

另外,我知道如果我使用简单的get 读取某个文档,只要该文档已经存在于离线缓存中,我不会收费, 并且在 Firestore 中没有更改(根据 Doug Stevenson)。

 DocumentSnapshot doc = await Firestore().collection("someCollection").document("documentID").get();

我的问题是:

假设我的离线缓存中已经存在一个文档,并且此后在 Firestore 中没有更改。

如果不是get,而是打开一个listener来收听这个单一的文档 (DocumentSnapshot,不是QuerySnapshot),像这样:

Stream<DocumentSnapshot> stream = Firestore().collection("someCollection").document("documentID").snapshots();
stream.listen((documentSnapshot) => doSomething());

打开此侦听器后,我是否需要为一次阅读付费?

【问题讨论】:

【参考方案1】:

打开此侦听器后,我是否需要为一次阅读付费?

没有。如果您打开正在侦听单个文档的侦听器,则根本不需要付费,因为该文档已存在于缓存中。请记住,当查询未返回任何结果时,您需要读取一个文档,但在您的情况下,您没有执行任何查询,您只是在收听文档更改。每次开始收听更改或每次打开应用程序时都要为阅读一份文档收费是没有意义的。这就是 Firestore 的美妙之处,您拥有数据库的本地副本,因此您无需为缓存的文档付费,除非文档在后端发生更改。

【讨论】:

你怎么知道,你有这个信息的链接吗? 看到您正在使用的代码.collection("someCollection").document("documentID").snapshots() 我可以清楚地说您正在收听单个文档而不是执行查询,因此您不能被指控为“一次读取操作”。除此之外,一切都写在文档中。此外,您也可以自己测试。我已经做到了。 嗨,爱德华多!我可以帮助您了解其他信息吗? 感谢您的回答。 Firebase 团队需要改进文档。存在很多支付行为没有解释清楚。 谢谢。如果我要求一份文件清单会有所不同吗?如果只有一项更改,我是只支付一项还是全部支付?

以上是关于当我开始在 Firestore 中收听单个文档时,我是不是需要支付一次阅读费用,即使该文档没有更改?的主要内容,如果未能解决你的问题,请参考以下文章

Firestore:如何同时收听集合和子集合

为啥添加单个文档时,Firestore 侦听器会返回 .add 两次?

Firestore,检测添加到集合中的新文档等

Angular Firestore 映射文档到对象

Firestore 事务在单个事务中更新多个文档

为整个应用程序引用一个类的单个实例(Firebase)