【问题标题】:Is it possible to run aggregation queries in Firestore?是否可以在 Firestore 中运行聚合查询?
【发布时间】:2019-10-29 20:03:00
【问题描述】:

堆栈:

Ionic
Nodejs/Express
Cloud Firestore

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

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

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

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

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

    来自您链接的docs

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

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

    常见的解决方案是:

    1. 在客户端运行聚合

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

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

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

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

    3. 为您的聚合查询使用另一个数据库

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-14
      • 2023-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多