我想创建一个费用跟踪器,我想发现的一件事是每个类别每个月我要花费多少。

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

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

  • 有没有更好的办法?似乎2当前是最佳选择?但是我想知道是否我可以降低成本?

    我注意到我可能不需要聚合的数据是实时的,那么有没有办法消除云函数的执行呢?由于我有时会注意到,我将批量插入一堆交易。想知道是否有一种方法可以禁用某些查询的功能,例如在批处理完成后手动调用它们?

    最佳答案

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

    最佳方法主要取决于您拥有的交易数量。如果您的交易很少,那么在每个客户端上进行聚合可能就可以了。但是随着事务的增多,下载数据的开销将变得过高,并且您更有可能希望保持数据库中的运行总额。

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

    如果要分批聚合,则需要在您控制的服务器或Cloud Functions中定期运行代码。

    Cloud Functions中没有内置功能可消除文档写入的反跳。您可能在Firestore中保留了一个防反跳计数器,但是那会在每次交易中读取/写入一个文档。

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

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

  • 读取当前合计值
  • 向数据库查询自上次运行
  • 以来已添加的事务
  • 循环这些事务,更新合计值
  • 在事务中将聚合的值和最后一个时间戳写回到数据库中(以确保两者均被写入,或均未写入)
  • 10-07 19:49
    查看更多