在一次读取计数中仅从 Cloud Firestore 获取集合 ID

Get only collection IDs from Cloud Firestore in one read count

在 Cloud Foreshore 的 this 文档中提到 'a request for a list of collection IDs, you are billed for one document read.'

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

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

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

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

如果你有解决办法请告诉我。

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

即使我遇到过类似的情况,我想要一个集合中的文档总数,但是当您查询集合时,firebase 既不提供文档计数也不提供文档 ID return 包含整个文档的列表文件内容。

Firestore getCollections() 方法仅存在于服务器端 SDK 中,作为单个读取操作收费。但是作为 ,它 returns 集合 ids/names,而不是文档 ID。

要在客户端获取文档 ID,您需要阅读整个文档。所以这将按照您阅读的文档数量进行收费,并且会消耗每个文档中所有数据的带宽。

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

参见:

注意:您将按每检索一个文档阅读一次付费。此操作无法只计费一次。

正如人们在其他答案中提到的,这在客户端 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() 子句,这样您就可以用它来过滤集合。