如何计算存储在Google appengine数据存储区中的给定类型的所有条目?

时间:2009-05-21 18:29:24

标签: google-app-engine

我正在寻找的是将这个SQL翻译成Google AppEngine(for Java)术语:

select count(*) from Customers

看起来很简单,但是从阅读文档来看,似乎我必须运行一个匹配所有客户的查询,然后循环并计算结果,将分页考虑在内。我不想检索每个元素,我只想数数。

或者换句话说,有一个API可以遍历给定类型的所有条目(目前无法找到确切的API)。这似乎是非常低效的,更不用说数据存储调用也带有有限的配额。

任何提示都将不胜感激。

谢谢,Mark

5 个答案:

答案 0 :(得分:8)

正如wooble所说,bigtable不支持行计数作为一个基本概念 - 你可以编写一个包装函数,正如mcotton所说,但是,正如他从文档中引用的那样,最多仍然会限制为1000。

为了克服这些限制,您需要为每个要计数的实体保留一个计数器,每当放置一个这样的新实体时,该计数器会递增,当删除该类实体时递减。 / p>

为了保持您的应用程序具有高度可扩展性,您可能希望对这些计数器进行分片,请参阅http://code.google.com/appengine/articles/sharding_counters.html(遗憾的是我不知道该配方已转换为Java,但概念应该相同)。

答案 1 :(得分:3)

正如mcotton所说,似乎没有限制的“SELECT __ key __”查询上的count()可以做你想要的。

http://code.google.com/appengine/docs/python/datastore/queryclass.html#Query_count

这是Google Datastore中相对较新的功能。他们过去常常需要1000的限制。他们最近才删除了这个限制。现在唯一的限制是您的查询是否足够快地执行而不会超时。

如果这是一个真正庞大的数据并且您确实会遇到超时,那么您还可以考虑新的Google Mapper API。要了解更多信息,请在Google上搜索[appengine mapreduce]。

我同意GQL不支持“SELECT COUNT(*)”是非常了不起的。这似乎有点疏忽。但是只对键进行选择,然后使用count()不将这些键一直发送回应用程序应该表现得相似。

答案 2 :(得分:1)

不幸的是,BigTable不可能在没有运行查询的情况下对实体进行计数以匹配所有实体。请记住,当您有超过1000个应用程序时,Google搜索和Google阅读器等应用程序甚至无法为您提供准确的结果计数,如果您绝对,积极地认为您需要统计所有实体,则可以执行一系列keys_only查询每个限制为1000个实体,并将所有这些实体的计数加起来。

答案 3 :(得分:0)

这是一个非常古老的主题,但为了防止其他人看到它,有3种方法可以实现这一目标:

  1. 访问数据存储区统计信息
  2. 在数据存储区中保留计数器
  3. 分享计数器
  4. 这些方法中的每一种is explained in this link

答案 4 :(得分:0)

这只是推测,但我认为他们将在java中实现一个类似于python实现的count()方法。 HERE是python的count()方法。

计数(限制)

Returns the number of results this query fetches.

count() is somewhat faster than retrieving all of the data by a constant factor, but the running time still grows with the size of the result set. It's best to only use count() in cases where the count is expected to be small, or specify a limit.

Note: count() returns a maximum of 1000. If the actual number of entities that match the query criteria exceeds the maximum, count() returns a count of 1000.

Arguments:

limit

    The maximum number of results to count.