FireStore / CloudDatastore上的聚合。使用云功能onCreate / Update?

问题描述 投票:2回答:1

我想创建一个费用跟踪器,我想知道的一件事是我每个类别每个月花了多少钱。

我应该如何在FireStore / DataStore中执行此操作?

  1. 下拉所需数据并在本地进行聚合?似乎很慢?
  2. 每次创建/更新事务时执行聚合并将其保存在表中?但这可能导致许多函数调用,这可能代价高昂?

有没有更好的办法?好像2目前是最好的选择?但是我想知道无论如何我还能降低成本吗?

我注意到我可能不需要实时汇总数据,那么有没有办法去除云功能执行?因为我注意到有时候,我会批量插入一堆交易。不知道有没有办法禁用某些查询的功能,并在批处理结束后手动调用它们?

firebase google-cloud-datastore google-cloud-functions google-cloud-firestore
1个回答
2
投票

您描述的两种方法确实是最常见的。

最好的方法主要取决于您拥有的交易数量。如果您的交易很少,那么在每个客户端上进行聚合可能完全没问题。但随着您获得更多事务,下载数据的开销将变得过高,您更有可能希望在数据库中保持运行总计。

我通常建议保持最新的任何交易。您甚至可以使用客户端代码,通过使用事务(防止多个用户覆盖彼此的更新)和服务器端安全规则(以防止恶意行为者编写与其事务不匹配的聚合)来实现。

如果要批量聚合,则需要定期运行代码,可以在您控制的服务器中运行,也可以在云功能中运行。

Cloud Functions中没有任何内容可以去除文档写入。您可以在Firestore中保留一个去抖动计数器,但这样就可以在每个事务上读/写一个文档。

更合理似乎在计时器上运行一个函数,如本博客文章中所述并在此视频中显示。但是,您需要确保在这种情况下您的数据结构允许代码检测它需要聚合的事务。

一种方法是确保以某种方式订购交易,例如,通过给他们一个timestamp,并让你的聚合代码跟踪(可能在数据库中)已经聚合的最后一个时间戳。然后每当聚合器运行时,它:

  1. 读取当前聚合值
  2. 查询数据库以查找自上次运行以来添加的事务
  3. 循环遍历这些事务,更新聚合值
  4. 将聚合值和最后一个时间戳写回事务中的数据库(以确保两者都被写入,或者两者都没有写入)
© www.soinside.com 2019 - 2024. All rights reserved.