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

时间:2017-12-24 13:18:41

标签: firebase google-cloud-datastore google-cloud-functions google-cloud-firestore

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

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

  1. 下拉所需数据并在本地进行聚合?似乎很慢?
  2. 每次创建/更新事务时执行聚合并将其保存在表中?但这可能导致许多函数调用,这可能代价高昂?
  3. 有更好的方法吗?好像2目前是最好的选择?但是我想知道无论如何我还能降低成本吗?

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

1 个答案:

答案 0 :(得分:2)

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

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

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

如果要批量聚合,您需要定期运行代码,无论是在您控制的服务器中,还是在云功能中。

Cloud Functions中没有任何内容可以去除文档写入。您可以在Firestore中保留一个去抖动计数器,但那将是每次交易时读/写文档。

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

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

  1. 读取当前汇总值
  2. 在数据库中查询自上次运行以来已添加的事务
  3. 循环这些事务,更新聚合值
  4. 将聚合值和最后一个时间戳写回事务中的数据库(以确保两者都被写入,或者两者都没有写入)