在Google Appengine数据存储区中计算特定范围内的实体

时间:2015-04-05 20:27:22

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

我是Google Datastore的新手。我正在构建一个简单的应用程序,我想计算满足特定条件的实体数量。显而易见的方法是首先查询该实体,然后对结果进行计数:

// Applying query on the "height" property of the entity "Person
Filter heightFilter = new FilterPredicate("height",
                  FilterOperator.GREATER_THAN_OR_EQUAL,
                  minHeight);

// Use class Query to assemble a query
Query q = new Query("Person").setFilter(heightFilter);

// Use PreparedQuery interface to retrieve results
PreparedQuery pq = datastore.prepare(q);

// And now count.

我想知道这是否是执行此特定任务的最佳方式。查询机制将遍历此特定实体的整个数据库(本例中为Person)并逐个匹配。如果我只需要计数而不是整个实体,有没有更好的方法呢?

2 个答案:

答案 0 :(得分:2)

数据库并非专为此类查询而设计,计数很难扩展,因此我们鼓励您为满足您的特定需求提供解决方案。

在这种情况下,您可以拥有一个可以为您保留计数的模型,并在每次添加/删除Person时更新它。然后为了获得计数,你只需获取一个实体并读取计数,这对于读取来说是完美的,快速且便宜。

问题现在出现在写入上,因为您想要以事务方式执行此操作(以保持准确计数),您的应用程序中可能会出现每秒超过1-5次更新的情况,并且事务需要重试并可能成为瓶颈。此阶段的一个流行解决方案是使用Sharding counters,它将计数过程分布在多个实体上,因此吞吐量会逐渐增加。

我建议你保持简单,只有在真正需要时才采用更先进的技术,以控制复杂性。永远不要指望,使用这种技术(非sql)的想法是在写入时预先支付成本,因此读取尽可能快速有效。

答案 1 :(得分:-1)

以下代码段只返回键而不是整个实体,只有键才能查询“小操作”,因此更快,更重要......免费。

Query q = new Query("Person").setKeysOnly();