是否有方法迭代firestore中集合中的所有文档

时间:2018-01-29 05:40:52

标签: firebase google-cloud-firestore

我正在使用firebase的firestore,我想遍历整个集合。是否有类似的东西:

db.collection('something').forEach((doc) => {
  // do something
})

3 个答案:

答案 0 :(得分:5)

是的,您可以使用集合引用上的get()方法简单地在集合中查询其所有文档。 CollectionReference对象是Query的子类,因此您可以在其上调用Query方法。收集引用本身就是对其所有文档的未过滤查询。

Android:Query.get()

iOS / Swift:Query.getDocuments()

JavaScript:Query.get()

在每个平台中,此方法都是异步的,因此您必须正确处理回调。

另请参阅" Get all documents in a collection"。

的产品文档

答案 1 :(得分:4)

db.collection("cities").get().then(function(querySnapshot) {
    querySnapshot.forEach(function(doc) {
        // doc.data() is never undefined for query doc snapshots
        console.log(doc.id, " => ", doc.data());
    });
});

答案 2 :(得分:1)

如果您知道集合中没有太多文档(例如数千或数百万),那么您可以使用 collectionRef.get(),如此处最高投票答案中所述并在 Firebase {{3} }.

然而,在许多情况下,一个集合可能包含大量的文档,您不能一次“获取”,因为您的程序的内存使用量会爆炸式增长。在这些情况下,您需要实现不同的遍历逻辑,该逻辑将分批遍历整个集合。您还需要确保不会遗漏任何文件或多次处理任何文件。

这就是我编写 docs 的原因,这是一个开源的 Node.js 库,正好解决了这个问题。它是一个极其轻便、健壮、类型良好且文档齐全的库,可为您提供可配置的遍历器对象,引导您浏览给定的集合。

您可以找到 Github 存储库 Firecode 和文档站点 here。此外,这里有一个简短的片段,向您展示了如何使用 here 遍历 users 集合。

const usersCollection = firestore().collection('users');
const traverser = createTraverser(usersCollection);

const { batchCount, docCount } = await traverser.traverse(async (batchDocs, batchIndex) => {
  const batchSize = batchDocs.length;
  await Promise.all(
    batchDocs.map(async (doc) => {
      const { email, firstName } = doc.data();
      await sendEmail({ to: email, content: `Hello ${firstName}!` });
    })
  );
  console.log(`Batch ${batchIndex} done! We emailed ${batchSize} users in this batch.`);
});

console.log(`Traversal done! We emailed ${docCount} users in ${batchCount} batches!`);