如何有效地从 Firebase 实时数据库中获取 7 天、30 天的摘要?

Posted

技术标签:

【中文标题】如何有效地从 Firebase 实时数据库中获取 7 天、30 天的摘要?【英文标题】:How to efficiently get 7 days, 30 days summary from Firebase realtime database? 【发布时间】:2019-12-06 21:28:53 【问题描述】:

在 firebase 数据库中,我创建了一个名为“orders”的数据库。要存储的数据格式如下:


    cost: orderCost,
    createdAt: createdAt,

在firebase中,树如下:

我想要实现的是根据createAt时间戳快速获取最近7天或30天的费用总和。

我想到的是为createdAt创建索引,并基于它运行查询。

但是如果数据集很大,比如几百万个条目,运行上述查询是否仍然有效?

请多多指教。谢谢!

【问题讨论】:

【参考方案1】:

基本上你想要的是一个计数器/聚合。根据您需要的摘要的粒度以及数据摄取/文档写入的速率,您将:

    使用Cloud Function triggers 对成本总和进行每日聚合 如果数据量很大,请使用distributed counter 更新总和。

有了可用的每日汇总统计信息,您可以通过仅查询 N 个文档来进行任何临时 N 天的汇总。

如果您热衷于探索其他选项,还可以将 Firebase 中的数据推送到 BigQuery 等分析工具。

【讨论】:

【参考方案2】:

Firebase 实时数据库没有内置聚合函数。

你有几个选择:

加载所有数据,并按需计算聚合。 继续在数据库中运行聚合,并在每次写入操作时更新。 将数据从 Firebase 导出到具有更好查询功能的系统(如 BigQuery 或 Data Flow),然后将结果写回 Firebase。

这个话题之前已经介绍过,所以我建议你去看看:

What is the best way to show reports with firebase? Realtime database data structure modeling How to use Firebase for statistics? Do some work on the data on firebase database Sum firebase data efficiently up Retrieve count data from Firebase like mysql Analyze Firebase data Create dashboard on Firebase Database for various metrics

【讨论】:

谢谢弗兰克。我也想到了第二种方法。假设对于 7 天聚合,我想我可以创建一个单独的 ref("7days") 来存储最近的 7 天数据。如果我想要 7 天的总和,我只需要去 ref("7days") 来总结它们。我听说我们可以在云功能中做日程安排功能。通过这种方式,云功能可以表现得像一个 cron 作业,它可以推送新数据并弹出超过 7 天的数据。这听起来对你可行吗?谢谢! 1) 我更可能按天和周汇总,然后读取您需要报告的天数/周数。这需要固定数量的读取,同时允许更灵活的报告模型。 2) 调度云函数,见firebase.google.com/docs/functions/schedule-functions 我完全同意。感谢您的建议!

以上是关于如何有效地从 Firebase 实时数据库中获取 7 天、30 天的摘要?的主要内容,如果未能解决你的问题,请参考以下文章

如何有效地从 NSManagedObject 中获取属性的所有有效值?

如何从 firebase 实时数据库中获取子值?

如何从 Firebase 实时数据库中检索/获取项目

如何根据 Angular 6 中的 Firebase 实时数据库中的键获取单个记录

如何在flutter中从firebase实时数据库中获取数据?

如何有效地从 Android 上的资源中获取短数组?