【问题标题】:Google Cloud Firestore console reading of all documents and chargesGoogle Cloud Firestore 控制台读取所有文件和费用
【发布时间】:2019-07-10 18:54:43
【问题描述】:

我是 Firestore 的新手,所以我有一个 Profiles 和 Users 集合。在 Cloud Firestore 控制台中,当我单击数据库 > Firestore > 数据选项卡 > 配置文件或 > 用户时,控制台正在读取每个集合中的所有文档。这些读取在“使用”选项卡中计算。所以我的问题是,如果我在 Profiles 集合中说 500K 文档并单击 Data,我将被收取阅读 500K 文档的费用,只是为了查看前 25 个文档。只需单击数据选项卡,控制台就会读取第一个集合的所有文档。

我尝试使用过滤器,但要使用它,您必须先单击集合并阅读所有文档,然后才能编辑过滤器。

这是它的工作方式还是我的误解?

【问题讨论】:

    标签: google-cloud-firestore firebase-console


    【解决方案1】:

    不久前我遇到了同样的困惑,在深入研究这个问题后,我了解到加载到 Firestore 页面的“数据”标签中的所有数据都计入 Firestore 的整体使用量 .

    但是,我担心与您相同的问题,因此我联系了 Firebase 支持。他们回过头来确认我的第一直觉(在“数据”选项卡中读取的文档确实计数)但最初它只读取任何选定集合的前 300 个文档,因此即使您的集合有超过 100 万个文档,它也会仍然只加载前 300 个文档。

    他们提出了解决方案,直到 Firebase 团队找到合法解决方案

    1. 为 Firestore 页面的 Usage 标签添加书签。 (所以你基本上“跳过”数据选项卡和无用的 300 次读取)
    2. 以某种方式添加一个虚拟集合,以确保它是默认情况下在 Firestore 页面上加载的第一个集合(按字母顺序)。

    【讨论】:

      【解决方案2】:

      所以我的问题是,如果我在 Profiles 集合中有 500K 文档并单击 Data,我将收取阅读 500K 文档的费用

      绝对不是!您只需对不属于查询的文档进行读取操作。我不知道第一个查询受限的确切数字,但数据以较小的块加载,换句话说,实现了分页系统。因此,一旦您向下滚动,就会加载其他元素,依此类推。

      如果您打算创建一个使用 Firestore 作为后端的应用,还请注意,offline persistence:

      对于 Android 和 iOS,默认启用离线持久化。

      对于 Web,默认情况下禁用离线持久性。要启用持久性,请调用enablePersistence 方法。

      • 对于 Web,脱机持久性是一项实验性功能,仅受 Chrome、Safari 和 Firefox Web 浏览器支持。此外,如果用户打开多个指向同一个 Cloud Firestore 数据库的浏览器选项卡,并且启用了离线持久性,则 Cloud Firestore 将仅在第一个选项卡中正常工作。

      这意味着,一旦您从 Firebase 服务器获取文档,您将不再被记录,因为结果来自本地缓存。

      【讨论】:

      • 感谢 Alex,但每次我点击我的 Profiles 或 Users 集合并在几分钟后我转到 Usage 选项卡时,我注意到读取的数量增加了每个集合中的文档数量。单击数据选项卡打开并读取集合窗格中第一个集合中的所有文档。单击一个集合会读取所有文档并将它们添加到我的使用读取计数中。我再次说的是控制台,而不是来自 Andoird 或 iOS 的 API。一定有什么我错过了,或者就是这样。
      • 让我更困惑的是,它不仅计算文档,实际上还计算每个集合的键数以及右侧窗格中的任何对象。在我的个人资料中,我有 42 个文档,每次单击个人资料时,使用计数器都会增加 84。
      • 请看我更新的答案。我第一次想到别的事情。
      • 控制台计数读取的方式对我来说仍然不清楚和困惑。我已将 100 个文档添加到 Profiles 集合中,总共 142 个文档。现在,每次我单击数据时,使用读取计数器都会增加 300!对此有解释吗?我认为控制台不应该读取和显示任何文档,除非我(用户)在显示和计算任何内容之前通过查询或过滤器告诉它这样做。
      • 没有看到你的代码和实际数据,我帮不上什么忙。我已经以与您相同的方式测试了读取次数,并且它工作正常。也许您正在单独执行一些您不知道的其他读取操作。
      【解决方案3】:

      我只是有一个类似的问题,我发现将其作为问题发布是多余的,所以我将其发布为答案,对此感到抱歉,

      问题:

      this.db.collection(this.collectionName.usersCollection)
              .doc(currentUserId).collection(this.collectionName.friendsCollection)
              .where("friendID","==",id)    
              .get().then(snapshot =>{
                if(snapshot.empty)
                {
      
                  this.db.collection(this.collectionName.chatsCollection).add({
                    user1 : currentUserId,
                    user2 : id
                  }).then(docRef =>{
                    docId = docRef.id;
                    this.db.collection(this.collectionName.usersCollection)
                    .doc(currentUserId)
                    .collection(this.collectionName.friendsCollection).doc(docId)
                    .set({
      
                      friendID: id,
      
                    })
                    this.db.collection(this.collectionName.usersCollection).doc(id)
                    .collection(this.collectionName.friendsCollection).doc(docId)
                    .set({
                      friendID:currentUserId,
      
                     })
                     resolve(docRef.id);
                  })
      
                }
                else{
                    snapshot.forEach(document =>{
                      // console.log("friend id",document.data().friendID, "  docid: ",document.data().docId);
                      resolve(document.id);
                    })
                }
              })
      

      所以我在这里写和读 docId ,所以它会影响计数吗?我无法正确进行检查,因为正在发生许多其他操作。 谢谢。

      【讨论】:

        猜你喜欢
        • 2021-07-02
        • 2021-09-06
        • 1970-01-01
        • 2019-04-15
        • 2022-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多