【问题标题】:Get only collection IDs from Cloud Firestore in one read count在一次读取计数中仅从 Cloud Firestore 获取集合 ID
【发布时间】:2020-04-12 09:13:00
【问题描述】:

在 Cloud Foreshore 的this 文档中提到“请求收集 ID 列表,您需要为读取一个文档付费。”

现在我在我的项目中使用 AngularFire 和 Ionic3。我的要求是从具有 where 条件的集合中获取 仅集合 ID。如果我执行以下操作,我将花费我的读取次数 = 结果中的文档数。

let snap = this.afs.collection('path').ref
        .where('field', "==",'data').get();

snap.forEach(x => {
          list.push(x.id);
        });

我无法使用我在几个地方找到的方法getCollections() 作为解决方案。

如果您有解决方案,请告诉我。

【问题讨论】:

    标签: firebase ionic-framework google-cloud-firestore angularfire


    【解决方案1】:

    Firestore getCollections() 方法仅存在于服务器端 SDK 中,作为单次读取操作收费。但作为Doug answered,它返回collection ids/names,而不是文档ids。

    要在客户端获取文档 ID,您需要阅读整个文档。因此,这将按您阅读的文档数量计费,并且会占用每个文档中所有数据的带宽。

    在服务器上,您可以使用select() 方法获取仅包含文档ID 的列表。您仍然需要为阅读每个文档付费,但会消耗更少的带宽。

    见:

    【讨论】:

    • 这就解释了一切。无法将文档 ID 读取为单次读取(无论客户端/服务器端)。谢谢弗兰克!
    【解决方案2】:

    听起来您想知道是否有一种方法可以在不读取每个文档的情况下获取集合中的所有文档 ID。目前这是不可能的。使用 Firestore 客户端 SDK 时,您唯一的选择是查询整个集合,这会将每个文档的全部内容传输到客户端。

    【讨论】:

    • 如果是关于内存大小怎么办?假设您有大量文档,每个文档都有数百千字节。您只需要文档的 ID,以便能够列出/链接到它们。如果所有文档内容都已加载,您将拥有数百兆的内存而不需要它们。
    • 我们目前正面临这个问题,对我们来说更多的是带宽。云功能的冷启动太慢,后端做不了。
    【解决方案3】:

    即使我遇到了类似的情况,我想要一个集合中的总文档数,但是当你查询集合时,firebase 既没有给你文档数也没有给出文档 ID,它返回包含文档全部内容的文档列表。

    p>

    【讨论】:

      【解决方案4】:

      注意:您将需要支付每个文档读取一次检索的费用。此操作无法只计费一次。

      正如人们在其他答案中提到的那样,这在客户端 firebase SDK 上是不可能的。但这可以使用服务器代码中的firebase-admin

      你可以这样做:

      admin.initializeApp(config);
      
      const querySnapshot = await admin.firestore().collection("YOUR_COLLECTION").select().get();
      for (const docSnapshot of querySnapshot.docs) {
        console.log(docSnapshot.id);       // THIS WILL PRINT THE DOC ID
        console.log(docSnapshot.data());   // THIS WILL PRINT EMPTY OBJECT {}
      }
      

      您可以看到docSnapshot.data() 打印出{},因为除了docSnapshot 中的文档引用之外,没有检索到任何文档数据。

      这对于获取大量 ID 文档列表很有用,而无需下载随之而来的大量文档数据,如果您要使用以下内容:admin.firestore().collection("YOUR_COLLECTION").get()

      https://googleapis.dev/nodejs/firestore/latest/CollectionReference.html#select

      您还可以在 select() 之前传递 where() 子句,以便使用它过滤集合。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-01
        • 2019-12-24
        • 2018-04-04
        • 2018-11-07
        • 1970-01-01
        • 1970-01-01
        • 2018-04-14
        • 2018-03-18
        相关资源
        最近更新 更多