首页 > 解决方案 > 是否可以在 Firestore 中运行聚合查询?

问题描述

堆:

Ionic
Nodejs/Express
Cloud Firestore

我的任务是编写一个应用程序,它以“日”格式获取日期,当天有余额,并使用 Chart.js 在图表中显示该数据。有间隔按钮可让您在“日”、“周”和“月”之间进行更改,这些按钮应该将日期分组为相应的间隔。

目前使用 1 个集合可以正常工作。“天”和“周”都可以工作,但是一旦我们到达“月”,有大量数据,Firestore 就会在我的后端中杀死自己。它尝试轮询的数据量太大。我目前使用“天”在后端运行“周”和“月”的聚合。

我可以在文档中找到的唯一聚合文档是:https ://firebase.google.com/docs/firestore/solutions/aggregation ://firebase.google.com/docs/firestore/solutions/aggregation它没有给我结果,它将它存储在一个对我没有帮助的集合中. 该应用程序可以在单个日期更改余额,这会在事后对余额产生连锁反应 - 所以我必须生成间隔更改的值。

是否存在这样的事情,或者我是否坚持创建 3 个单独的集合,天/周/月并轮询所需的集合?

标签: firebasegoogle-cloud-firestore

解决方案


从您链接的文档中:

Cloud Firestore 不支持原生聚合查询。

因此,这几乎可以回答您标题中的问题:Firestore 没有在数据库服务器上运行聚合的内置功能。

常见的解决方案是:

  1. 在客户端上运行聚合

    听起来这就是您现在正在做的事情:您正在下载内部的所有数据,然后将其聚合到客户端。这种方法可以很好地用于小型数据集,但如果您只在客户端中显示聚合,您可能会下载比需要更多的数据。这就是为什么如果您的数据集可能很大,您应该考虑替代方案,当您使用 Firestore 时,它​​通常会(出现)。

  2. 每次数据更改时更新聚合

    在这种情况下,您将聚合值存储在数据库中,并在您写入聚合值时更新它。该文档显示了一个以这种方式计算移动平均值的示例,它根本不需要查询,因此可以扩展到任何大小的数据集。

    在这种情况下,您必须记住,Firestore 仅限于每秒对每个文档执行大约一次写入。因此,如果您收到的数据多于该数据,您可能需要分发聚合查询,如分布式计数器文档中所示。

  3. 使用另一个数据库进行聚合查询

    另一种选择是使用 Firestore 存储客户端读取的数据,但使用另一个数据库进行复杂的动态查询。

    一个典型的例子是将数据从 Firestore 导出到 BigQuery,然后在 BigQuery 中执行计算,并将结果写回 Firestore,以便客户端可以读取它们。在这里,您将这两种产品都用于它们最擅长的领域:Firestore 用于大规模提供数据,BigQuery 用于大规模处理数据。


推荐阅读