【问题标题】:How do I get a count of all entries of a given type stored in Google appengine's datastore?如何获取存储在 Google appengine 的数据存储区中的给定类型的所有条目的计数?
【发布时间】:2009-05-21 18:29:24
【问题描述】:

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

select count(*) from Customers

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

或者另一种方式,有一个 API 可以遍历给定类型的所有条目(目前无法找到确切的 API)。这似乎效率很低,更不用说数据存储调用也有有限的配额。

任何提示将不胜感激。

谢谢,马克

【问题讨论】:

    标签: google-app-engine


    【解决方案1】:

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

    要克服这些限制,您需要为每种要计数的实体保留一个计数器,该计数器在每次放置该类型的新实体时递增,在删除该类型的实体时递减。

    为了让您的应用保持高度可扩展性,您可能需要对此类计数器进行分片,请参阅 http://code.google.com/appengine/articles/sharding_counters.html(不幸的是,我不知道该配方是否已翻译成 Java,但概念应该是相同的)。

    【讨论】:

      【解决方案2】:

      正如 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() 不将这些键一直发送回应用程序,其行为应该类似。

      【讨论】:

        【解决方案3】:

        不幸的是,BigTable 无法在不运行查询以匹配所有实体的情况下对实体进行计数。请记住,当您拥有超过 1000 个实体时,Google Search 和 Google Reader 等应用程序甚至不会为您提供准确的结果计数,如果您绝对肯定地认为您需要计算所有实体,您可以执行一系列keys_only 查询限制为每个实体 1000 个,并将所有实体的计数相加。

        【讨论】:

          【解决方案4】:

          这只是猜测,但我认为他们会在 java 中实现 count() 方法,类似于他们的 python 实现。 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.
          

          【讨论】:

          • 当结果 > 1000 时,这会返回准确的计数吗?
          【解决方案5】:

          这是一个非常古老的线程,但为了防止其他人看到它,有 3 种方法可以完成此操作:

          1. 访问数据存储统计信息
          2. 在数据存储中保留一个计数器
          3. 共享计数器

          这些方法中的每一种is explained in this link

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-03-25
            • 1970-01-01
            • 2013-04-25
            • 1970-01-01
            • 1970-01-01
            • 2010-10-26
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多