是否可以在 Firestore 中运行聚合查询?

Squ*_*ler 4 firebase google-cloud-firestore

堆:

Ionic
Nodejs/Express
Cloud Firestore
Run Code Online (Sandbox Code Playgroud)

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

目前使用 1 个集合效果很好。“天”和“周”都可以,但是一旦我们进入“月”并拥有大量数据,Firestore 就会在我的后端自杀。它尝试轮询的数据量太大。我目前使用“天”在后端运行“周”和“月”的聚合。

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

是否存在类似的情况,或者我是否坚持创建 3 个单独的集合(天/周/月)并轮询所需的集合?

Fra*_*len 10

更新:自 2022 年 10 月起,Firestore 支持使用聚合查询对文档进行计数,在 JavaScript 中如下所示:

const coll = collection(db, "cities");
const snapshot = await getCountFromServer(coll);
console.log('count: ', snapshot.data().count);
Run Code Online (Sandbox Code Playgroud)

您还可以使用查询来限制计算哪些文档,如下所示:

const coll = collection(db, "cities");
const query_ = query(coll, where('state', '==', 'CA'));
const snapshot = await getCountFromServer(query_);
console.log('count: ', snapshot.data().count);
Run Code Online (Sandbox Code Playgroud)

当您使用该count()操作时,您需要为计算的每 1,000 个文档读取 1 个文档付费,每次操作至少读取 1 个文档count()。计数操作的最长执行时间为 60 秒,之后就会超时。有关性能测试,请参阅Cloud Firestore 中文档计数的速度有多快?

出于性能和成本原因,在计算许多用户的大量项目时,您通常仍希望使用替代方法,因此我将之前的答案保留在下面。


更新:自 2023 年底以来,还可以在读取时计算多个 Firestore 文档的总和和平均值。我建议查看有关使用聚合查询汇总数据的文档和我的帖子:How should I handleaggregate value in Firestore


之前的回答

从您链接的文档中:

Cloud Firestore 不支持本机聚合查询。

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

常见的解决方案是:

  1. 在客户端上运行聚合

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

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

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

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

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

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

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