我想创建一个费用跟踪器,我想发现的一件事是每个类别每个月我要花费多少。
我应该如何在FireStore / DataStore中执行此操作?
有没有更好的办法?似乎2当前是最佳选择?但是我想知道是否我可以降低成本?
我注意到我可能不需要聚合的数据是实时的,那么有没有办法消除云函数的执行呢?由于我有时会注意到,我将批量插入一堆交易。想知道是否有一种方法可以禁用某些查询的功能,例如在批处理完成后手动调用它们?
最佳答案
您描述的两种方法确实是最常见的。
最佳方法主要取决于您拥有的交易数量。如果您的交易很少,那么在每个客户端上进行聚合可能就可以了。但是随着事务的增多,下载数据的开销将变得过高,并且您更有可能希望保持数据库中的运行总额。
我通常建议您在进行任何交易时都保持最新状态。您甚至可以通过使用客户端代码,使用事务(以防止多个用户覆盖彼此的更新)和服务器端安全规则(以防止恶意行为者编写与其交易不匹配的聚合)来做到这一点。
如果要分批聚合,则需要在您控制的服务器或Cloud Functions中定期运行代码。
Cloud Functions中没有内置功能可消除文档写入的反跳。您可能在Firestore中保留了一个防反跳计数器,但是那会在每次交易中读取/写入一个文档。
如本博客文章中所述和此视频中所示,似乎更合理的方法是在计时器上运行函数。但是您需要确保在这种情况下,您的数据结构允许代码检测其需要聚合的事务。
一种这样做的方法是确保可以以某种方式订购交易,例如通过给他们一个timestamp
,并让您的聚合代码跟踪(可能在数据库中)它已经聚合的上一个时间戳。然后,只要聚合器运行,它就会: