减少Firestore上的读取使用量

时间:2019-12-06 14:04:26

标签: firebase google-cloud-firestore nosql

我们目前正在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。一段时间以来,它可能是一个解决方案,但如果用户群在增长,也将是一个限制。

谢谢您的建议。


编辑2019/12/06#1

以下是步骤集合中使用的查询(此处为iOS)。

  • 获取特定时间段的排行榜(例如:每日= 20191206,每月= 201912)
.limit()
  • 在特定时间范围内更新用户步骤
db
    .collection("steps")
    .document(date.string)
    .collection("users")
    .whereField("steps", isGreaterThan: 0)
    .order(by: "steps", descending: true)
    .getDocuments { }

1 个答案:

答案 0 :(得分:1)

根据Firebase official documentation,您需要按文档读取,写入和删除的费用付费。所以您的计算似乎还可以。

根据用户数量,您可能需要考虑使用付费计划。可能是Flame Plan

但是,这里建议尽量减少收费:

由于您是基于步骤数来讨论排行榜,因此我认为您实际上并不需要每隔几秒钟进行一次更新。

我要做的是,在每个特定时间范围内进行一次查询,并将值存储在Cloud Storage中,在其中按存储大小而不是读/写收费(每月5GB可用空间)。然后让您的应用从Cloud Storage获取数据。

这样,无论拥有多少用户,您都将获得恒定的读取次数。

  

例如:

     

100个用户并每10分钟更新一次排行榜

     

100 x(24x60 / 10)= 每天1.44万次读取

根据您的用例,您也许也可以遵循类似的逻辑进行写操作。