【发布时间】:2022-10-20 20:15:06
【问题描述】:
如何有效地计算大型 Firestore 集合中的文档。
显然,我不想获得整个收藏品并在前端进行计数,因为钱会飞涨。真的没有简单的 API,例如 db.collection('someCollection').count() 或类似的,但我们需要破解它吗?
【问题讨论】:
标签: firebase google-cloud-platform google-cloud-firestore
如何有效地计算大型 Firestore 集合中的文档。
显然,我不想获得整个收藏品并在前端进行计数,因为钱会飞涨。真的没有简单的 API,例如 db.collection('someCollection').count() 或类似的,但我们需要破解它吗?
【问题讨论】:
标签: firebase google-cloud-platform google-cloud-firestore
(2022-10-20) 编辑:
从现在开始,实际上可以计算集合中的文档或查询返回的文档,而无需保留计数器。因此,您可以使用新的 count() 方法计算文档,该方法:
返回一个查询,该查询计算此查询的结果集中的文档。
这一新功能是在今年的 Firebase 峰会上宣布的。请记住,此功能不会读取实际文档。所以根据official documentation:
对于 count() 等聚合查询,您需要为每批最多 1000 个与查询匹配的索引条目读取一个文档。对于匹配 0 个索引条目的聚合查询,读取一份文档的最低费用。
例如,匹配 0 到 1000 个索引条目的 count() 操作按一个文档读取计费。对于匹配 1500 个索引条目的 count() 操作,您需要支付 2 次文档读取费用。
真的没有简单的 api,例如 db.collection('someCollection').count() 或类似的
不,那里没有。
但我们需要破解它
是的,我们可以使用一种解决方法来计算集合中的文档数量,即保留一个单独的计数器,每次将文档添加到集合中或从集合中删除时都应该更新该计数器。
此计数器可以作为一个字段添加到 Firestore 中的文档中。但是,如果集合中的文档添加或删除非常频繁,那么这种解决方案可能会有点昂贵,在这种情况下我强烈建议您使用Realtime Database。在这种情况下,更新计数器时无需支付任何费用,而只需在阅读(下载)计数器时支付。而且由于它只是一个数字,因此您几乎无需支付任何费用。几年前,我什至写了一篇关于在 Firestore 中计数文档的解决方案的文章:
【讨论】: