我是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)并逐个匹配。如果我只需要计数而不是整个实体,有没有更好的方法呢?
答案 0 :(得分:2)
数据库并非专为此类查询而设计,计数很难扩展,因此我们鼓励您为满足您的特定需求提供解决方案。
在这种情况下,您可以拥有一个可以为您保留计数的模型,并在每次添加/删除Person
时更新它。然后为了获得计数,你只需获取一个实体并读取计数,这对于读取来说是完美的,快速且便宜。
问题现在出现在写入上,因为您想要以事务方式执行此操作(以保持准确计数),您的应用程序中可能会出现每秒超过1-5次更新的情况,并且事务需要重试并可能成为瓶颈。此阶段的一个流行解决方案是使用Sharding counters,它将计数过程分布在多个实体上,因此吞吐量会逐渐增加。
我建议你保持简单,只有在真正需要时才采用更先进的技术,以控制复杂性。永远不要指望,使用这种技术(非sql)的想法是在写入时预先支付成本,因此读取尽可能快速有效。
答案 1 :(得分:-1)
以下代码段只返回键而不是整个实体,只有键才能查询“小操作”,因此更快,更重要......免费。
Query q = new Query("Person").setKeysOnly();