堆栈:
Ionic
Nodejs/Express
Cloud Firestore
我的任务是编写一个应用程序,该应用程序以“ day”格式记录日期,并具有该天的余额,并使用Chart.js在图表中显示该数据。有间隔按钮可让您在“天”,“周”和“月”之间进行切换,以将日期分组为相应的间隔。
当前使用1个收藏集可以正常工作。 “几天”和“几周”都可以工作,但是一旦我们进入拥有大量数据的“月”,Firestore就会在我的后端自杀。它尝试轮询的数据量太大。我目前在后端使用“天”对“周”和“月”进行汇总。
我在文档中只能找到的汇总文档是:https://firebase.google.com/docs/firestore/solutions/aggregation,它不会给我结果,它会将其存储在对我没有帮助的集合中。该应用程序可以在单个日期更改余额,这会在事实发生后在余额中产生连锁反应-因此,我必须在间隔更改时生成值。
是否存在类似的东西,还是我坚持创建3个独立的集合(天/周/月)并轮询所需的集合?
答案 0 :(得分:1)
通过您链接的docs:
Cloud Firestore不支持本机聚合查询。
因此,您可以很好地回答标题中的问题:Firestore不具有内置功能来在数据库服务器上运行聚合。
常见的解决方案是:
在客户端上运行聚合
这听起来像是您现在正在做的事情:您正在下载内部的所有数据,然后将其聚合到客户端上。这种方法适用于小型数据集,但如果仅在客户端中显示聚合,则可能会下载比所需更多的数据。这就是为什么如果您的数据集可能很大(在使用Firestore时通常会出现)的情况下,您应该考虑其他选择。
每次数据更改时更新汇总
在这种情况下,您将汇总值存储在数据库中,并在每次写入汇总值时对其进行更新。该文档显示了以此方式计算移动平均值的示例,该示例完全不需要查询,因此可以缩放到任何大小的数据集。
在这种情况下,您必须牢记,Firestore仅限于每秒对每个文档执行一次写操作。因此,如果您收到的数据更多,则可能需要分发聚合查询,如distributed counters上的文档所示。
使用其他数据库进行汇总查询
另一种选择是使用Firestore存储客户端读取的数据,但使用另一个数据库进行复杂的动态查询。
典型的示例是将数据从Firestore导出到BigQuery,然后在BigQuery中执行计算,然后将结果写回到Firestore,以便客户端可以读取它们。在这里,您会同时使用两种产品的最佳性能:Firestore用于大规模提供数据,BigQuery用于大规模处理数据。