在Firestore指南mentioned中,应该使用分布式计数器同时处理单个文档的多个更新。
这让我思考。通过此计数器实现,您如何对数据进行排序?例如,让我们说我有一个帖子数据库,每个帖子都有自己的分配计数器用于upvotes。现在,我想得到20个最受欢迎的帖子。你怎么能这样做?
根据我对Firestore数据库的理解,无法完成此操作。除非我错过了什么?对于我上面描述的这种用例的计数器,有没有更好的解决方案?
答案 0 :(得分:6)
计数器的主要问题是这个限制:
在Cloud Firestore中,您每秒只能更新一次文档,这对于某些高流量应用程序来说可能太低了。
解释如何使用分布式计数器解决此问题的同一documentation page也显示了如何读取计数器总数的示例:
要获取总计数,请查询所有分片并将其计数字段相加:
function getCount(ref) { // Sum the count of each shard in the subcollection return ref.collection('shards').get().then(snapshot => { let total_count = 0; snapshot.forEach(doc => { total_count += doc.data().count; }); return total_count; }); }
它还提到了这个的主要缺点:
成本 - 读取计数器值的成本随着分片数量的增加而线性增加,因为必须加载整个分片子集合。
解决此问题的一种方法是定期从分片中读取计数并更新主计数列表。这实质上将整个练习转变为地图缩减解决方案。您希望按计划运行此缩减代码,否则,您仍然会遇到写入速率限制。使用periodically triggered Cloud Function听起来非常理想。
答案 1 :(得分:0)
根据this post,另一种选择是使用实时数据库替换Firestore上的分布式计数器,但仍需要定期从实时数据库中读取计数并将其写回Firestore。
不确定这是否比分布式计数器更具扩展性。