如何使用Cloud Firestore计算集合中的文档数量

jus*_*820 39 database firebase google-cloud-firestore

在Firestore中,如何获取集合中的文档总数?

例如,如果我有

/people
    /123456
        /name - 'John'
    /456789
        /name - 'Jane'
Run Code Online (Sandbox Code Playgroud)

我想查询我有多少人并获得2.

我可以对/ people进行查询然后得到返回结果的长度,但这似乎是浪费,特别是因为我将在更大的数据集上执行此操作.

Dan*_*ath 34

您目前有3个选项:

选项1:客户端

这基本上就是你提到的方法.从集合中选择全部并在客户端计数.这适用于小型数据集,但如果数据集较大,显然不起作用.

选项2:写入时间尽力而为

使用此方法,您可以使用云功能更新计数器,以便从集合中添加和删除每个添加和删除.

这适用于任何数据集大小,只要添加/删除仅以小于或等于每秒1的速率发生.这为您提供了一个单独的文档,可以立即为您提供几乎当前的计数.

如果需要每秒超过1,则需要根据我们的文档实现分布式计数器.

选项3:写入时间精确

您可以在客户端中添加或删除文档的同时更新计数器,而不是使用云功能.这意味着计数器也是最新的,但您需要确保在添加或删除文档的任何位置包含此逻辑.

与选项2一样,如果要超过每秒,则需要实现分布式计数器

  • 只是想知道,将来可能有其他方法可以做到这一点吗?像SQL COUNT聚合函数一样简单,可以在大数据集上工作,同时保持良好的性能? (5认同)
  • @saricden COUNT聚合实际上有很多潜在的表演问题.Cloud Firestore系统专为在不考虑数据集大小的情况下保持相同性能特征的操作而设计,而COUNT则不然.我们正在研究未来取得平衡的选择. (3认同)

Ben*_*ane 8

聚合是可行的方法(firebase 函数看起来像是更新这些聚合的推荐方法,因为客户端向您可能不希望公开的用户公开信息)https://firebase.google.com/docs/firestore/solutions/aggregation

另一种方式(不推荐)不适合大型列表,需要下载整个列表: res.size 像这个例子:

   db.collection("logs")
      .get()
      .then((res) => console.log(res.size));
Run Code Online (Sandbox Code Playgroud)

  • 这要求您下载整个产品系列才能获得尺寸。这对于大型收藏品来说可能是极其有害的 (5认同)