使用where子句的数据存储聚合函数

时间:2014-12-16 02:01:47

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

我目前正在构建一个带有GAE后端的移动应用。我在CloudSQL& amp;之间徘徊数据存储的持久性。我宁愿使用数据存储,因为我将存储大量数据(而且它更便宜)。我的应用程序的一个要求是报告用户在给定日期范围内投入活动的小时数。我知道数据存储区上的Sum()函数确实不可能,因为它具有分布式特性,并且应该在每次插入/删除时使用和更新计数器。但是,如果我必须报告给定日期范围的总和,我不太确定这是如何工作的。我可以保留计数器的总时数,年初至今,月份和时间;周。但这仍然是相当有限的,因为我无法从1月23日 - 8月15日那里得到所用的时间。此外,它看起来像是多余的数据......

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

我知道Sum()不是数据存储区中的东西,但我想我正试图找到一些方法来实现与以下(简化)SQL等效的数据存储区:

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

1 个答案:

答案 0 :(得分: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,就可以累计小时数。