我们目前正在Firebase上使用免费套餐,其配额为5万次读取和2万次写入操作。
每天大约有100位用户,我们已经超出了读取操作的配额。 Firestore
的结构如下:
Firestore-root
|
--- steps (collection)
| |
| --- 20191206 (document)
| |
| --- users (collection)
| |
| --- 08yzYycNqYMZw7kdeGBNV9jcg1G2 (document)
| |
| --- country: "FR"
| |
| --- name: "florian"
| |
| --- steps: 24
| |
| --- updated_at: "2019-12-05T20:25:05Z"
该应用程序显示按步骤数排序的用户列表。
作为一个简单的计算,在每次启动应用程序时,如果x
等于users
集合中存储的用户条目数,则应读取x+1
个代表{{1}的文档}读取操作。对于打开该应用程序的100个用户和100个用户条目,应该已经有10100次读取操作(约为每日配额的20%)。
我对读操作的计算正确吗? (如果1次读取操作= 1次读取文档)。
另一方面,是否有一种方法可以优化Firestore结构以减少读取的文档数量?
我们目前有一个补丁,该补丁使用x+1
操作来避免选择所有条目来释放某些读取操作,但这不是永久解决方案。
在一个文档中拥有所有步骤数据似乎也是一个不好的解决方案,因为每个文档的大小必须小于1MB。一段时间以来,它可能是一个解决方案,但如果用户群在增长,也将是一个限制。
谢谢您的建议。
以下是步骤集合中使用的查询(此处为iOS)。
.limit()
db
.collection("steps")
.document(date.string)
.collection("users")
.whereField("steps", isGreaterThan: 0)
.order(by: "steps", descending: true)
.getDocuments { }
答案 0 :(得分:1)
根据Firebase official documentation,您需要按文档读取,写入和删除的费用付费。所以您的计算似乎还可以。
根据用户数量,您可能需要考虑使用付费计划。可能是Flame Plan。
但是,这里建议尽量减少收费:
由于您是基于步骤数来讨论排行榜,因此我认为您实际上并不需要每隔几秒钟进行一次更新。
我要做的是,在每个特定时间范围内进行一次查询,并将值存储在Cloud Storage中,在其中按存储大小而不是读/写收费(每月5GB可用空间)。然后让您的应用从Cloud Storage获取数据。
这样,无论拥有多少用户,您都将获得恒定的读取次数。
例如:
100个用户并每10分钟更新一次排行榜
100 x(24x60 / 10)= 每天1.44万次读取
根据您的用例,您也许也可以遵循类似的逻辑进行写操作。