当前位置: 首页 > 知识库问答 >
问题:

减少Firestore上的读取使用

南宫炜
2023-03-14

我们目前在Firebase上使用免费层,其中包含50k读取和20k写入操作配额。

每天大约有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集合中存储的用户条目数,则应读取代表x1读取操作的x1文档。对于打开应用程序的100个用户和100个用户条目,应该已经有10100次读取操作(约为每日配额的20%)。

我的计算对吗?(如果1次读取操作=1次读取文档)。

另一方面,有没有办法优化Firestore结构以减少文档读取的次数?

我们目前有一个补丁使用。limit()操作,以避免选择所有条目来释放一些读取操作,但这并不是一个永久的解决方案。

将所有步骤数据放在一个文档中似乎也是一个糟糕的解决方案,因为每个文档都必须有一个大小

谢谢你的建议。

以下是在steps集合中使用的查询(此处针对iOS)。

  • 获取特定时间段的排行榜(例如:每日=20191206,每月=201912)
db
    .collection("steps")
    .document(date.string)
    .collection("users")
    .whereField("steps", isGreaterThan: 0)
    .order(by: "steps", descending: true)
    .getDocuments { }

  • 更新特定时间范围内的用户步骤
db
    .collection("steps")
    .document(date.string)
    .collection("users")
    .document(uid)
    .setData([
        "steps": steps,
        "name": name,
        "country": country,
        "updated_at": Date.NowISO8601,
    ])

共有1个答案

罗昊空
2023-03-14

根据Firebase官方文件,您将按文件读取、写入和删除收取费用。所以你的计算似乎没问题。

根据用户数量,您可能需要考虑转向付费计划。可能是火焰计划。

然而,这里有一个最小化收费的建议:

既然你谈论的是基于步数的排行榜,我想你并不真的需要每隔几秒钟更新一次。

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

通过这种方式,无论用户数量多少,您都将拥有恒定的读取量。

例如:

100个用户

100 x(24x60 / 10) = 14.4K读/天

根据您的用例,您也可以遵循类似的写入逻辑。

 类似资料:
  • 问题内容: 我想减少阅读次数,以便从(问题数组)中获取问题的详细信息。 我的应用程序就像stackoverflow的一部分一样工作 。 我想说明 一个问题有 多少 顶,观点和评论 。因此,为了处理这个问题,我创建了多个集合,例如 问题集 ID 标题 创建日期 评论集 ID 评论 创建日期 问题喜欢 QuestionID 用户身份 QuestionViews QuestionID 用户身份 问题标签

  • 上下文:假设我有一个显示餐厅列表的应用程序 方法1:将所有餐厅添加到集合中,并将文档id保存在属于指定类别的数组中。所以,如果我想要所有的印度餐馆,我只需要获取包含所有印度餐馆Id的数组Indian,然后加载它们。 方法2:将所有餐厅添加到集合中,并为每个文档指定一个类别。因此,当用户需要印度餐馆列表时,我会使用where()将其过滤掉。在这种方法中,firestore是否会为所有100000次文

  • 我有一个名为的集合,其中包含100多个文档。应用程序的主屏幕有一个列表视图,显示所有文档的列表,但是这种方法不必要地会在用户每次打开应用程序时花费100次阅读。为了停止这种情况,我在每个文档中添加了一个名为的字段,每次用户更新任务文档时,我都会更新这些字段。现在这就是我如何构建主屏幕。 第一次查询将只获取在上次从服务器获取时间之后更新的文档。第二次查询将从缓存中提取所有文档。我不在乎第一次查询的结

  • 我利用的功能如下: < li >将< code>MySQL表读入< code>DataFrame < li >改造他们 < li >合并它们 < li >写给< code>HDFS 在的整个生命周期中,没有对其执行s。它曾经像预期的那样工作,但最近我遇到了问题。由于的延迟求值,导致读取操作的并行性降低。 因此,如果我读取使用与,然后

  • 我的applet已经可以读取存储在jar中的excel文件,但是要读取excel文件,我必须使用其他5个jar(DOM4J-2.0.0-alpha-2、POI-3.9-20121203、POI-OOXML-3.9-20121203、POI-OOXML-Schemas-3.9-20121203、xbean),总共10.1mb,不包括实际的applet jar(1.36mb)。这些需要一段时间来下载,