【问题标题】:Datastore aggregate function with where clause带有 where 子句的数据存储聚合函数
【发布时间】:2014-12-16 02:01:47
【问题描述】:

我目前正在构建一个带有 GAE 后端的移动应用。我在 CloudSQL 和 Datastore 之间折腾以获得持久性。我更喜欢使用数据存储,因为我将存储大量数据(而且更便宜)。我的应用程序的一项要求是报告用户在给定日期范围内投入活动的时间总和。我知道数据存储区上的 Sum() 函数实际上是不可能的,因为它是分布式的,并且应该在每次插入/删除时使用和更新计数器。但是,如果我必须报告给定日期范围的总和,我不太确定这将如何工作。我可能会保留总小时数、年初至今、月和周的计数器。但这仍然是相当有限的,因为我无法获得从 1 月 23 日到 8 月 15 日投入的时间。另外,这似乎是很多冗余数据......

有没有办法在数据存储中实现这种类型的聚合?或者 CloudSQL 是我唯一的选择。

我知道 Sum() 不是数据存储上的东西,但我想我正在尝试找到某种方法来实现与以下(简化)SQL 等效的数据存储:

SELECT sum(hours) 
FROM {activity table} 
WHERE {activity_date} between {min_date} and {max_date} 

【问题讨论】:

    标签: google-app-engine aggregate-functions google-cloud-datastore


    【解决方案1】:

    嗯,SQL 累加器效率更高,但应用引擎数据存储区将更有效地扩展非常大的数据集。要回答您的具体问题:如果每个实体都有一个 Date 属性 activity_date 和 int prop hours,请为 (activity_date, hours) 创建一个 search index,然后使用祖先投影查询:

    SELECT entity.date, entity.hours where entity.date > {min_date} sort by entity.date ascending and __key__ starts_with (Activity, 'Foosball')
    

    然后,只要您收到的实体的日期低于您的 max_date,您就可以将小时数相加。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-04
      相关资源
      最近更新 更多