实时侦听cloud_firestore查询的读取计数是多少,可以做得更好吗?

时间:2020-09-04 08:49:23

标签: firebase flutter google-cloud-firestore

想象一下我在flutter / dart中有以下伪代码:

  Stream<List<T>> list() {
      Query query = Firestore.instance.collection("items");
      return query.snapshots().map((snapshot) {
        return snapshot.documents.map((doc) {
          return standardSerializers.deserializeWith(serializer, doc.data());
        }).toList();
      });
  }

我正在听数据库中的“项目”的整个集合。为了简单起见,我们总共有10个文档,我一直在听更改。

我在代码中的某个地方收听此流。假设这个查询例如在第一次调用时返回所有10个“项目”。这算作10次读取,可以。如果我直接在Firestore Web界面(或其他位置)中修改了这些文档之一,则将触发监听器,即使我仅修改了一个文档,我的印象还包括另外10次读取。我检查了云项目的“用法”选项卡,并且对此表示怀疑。

  1. 是这种情况,即使为该查询只修改了一个文档,也要计数10个文档?

  2. 如果答案为是,那么下一个问题将是“想象我想对list()进行两次调用,一个调用为orderBy“ rating”,另一个调用为orderBy“ time”(随机属性),其中一个这些文档发生了变化,这意味着20次读取1次更新?”

我丢失了某些东西或者Firestore不适合我使用,或者我应该更改自己的体系结构,或者我算错了。

  1. 有什么方法可以只检索已更改的文档? (显然,我可以实现一个缓存,本地数据库和时间戳系统,以免在Firestore不这样做的情况下进行无用的读取)

pubspec.yaml =>

firebase_database: ^4.0.0
firebase_auth: ^0.18.0+1
cloud_firestore: ^0.14.0+2

这可能适用于所有iOS和Android之类的环境,因为它本质上是一个更通用的“ firestore”问题,但是在flutter / dart中使用示例,因为如果与flutterfire插件有关,这就是我正在使用的示例

谢谢。

1 个答案:

答案 0 :(得分:1)

问题1:是否只为该查询修改了一个文档就算10个文档读取?

否,如文档中所述:

当您收听查询[注意:(或集合或子集合)]的结果时,您需要付费阅读 每次添加或更新结果集中的文档。你是 从结果集中删除文档时,也会收取读取费用 因为文档已更改。 (相反,当文档是 删除,则无需支付阅读费用。)

此外,如果侦听器断开连接超过30分钟(对于 例如,如果用户离线),您将被收取以下费用: 如果您发出了全新的查询。 [注意:您的示例中有10个读物。]

问题2:如果答案是肯定的,那么下一个问题...

第一季度的答案是“否”:-)

Q3:有什么方法可以只检索已更改的文档?

是的,请参阅this part of the doc,它解释了如何在查询快照之间捕获对查询结果的实际更改,而不是简单地使用整个查询快照。对于Flutter,您应该使用docChanges属性。