【问题标题】:Aggregation on FireStore/CloudDatastore. Use Cloud Functions onCreate/Update?FireStore/CloudDatastore 上的聚合。在创建/更新时使用云函数?
【发布时间】:2017-12-24 13:18:41
【问题描述】:

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

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

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

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

我注意到我可能不需要实时聚合数据,那么有没有办法去抖动云函数的执行?因为我注意到有时,我会批量插入一堆事务。想知道是否有办法禁用某些查询的功能并在批处理完成后手动调用它们?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    Cloud Functions 中没有内置任何东西来消除文档写入的抖动。您可能会在 Firestore 中保留一个反跳计数器,但这将是在每个事务上读取/写入文档。

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

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

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

    【讨论】:

    • 如果这仍然是最好的方法,或者现在有任何新的聚合方法可用,请分享。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 2020-08-10
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    相关资源
    最近更新 更多