【问题标题】:datastore count query fetchOptions数据存储计数查询 fetchOptions
【发布时间】:2013-05-31 18:12:29
【问题描述】:

我想做以下事情:

PreparedQuery pq = datastore.prepare(q);
int count = pq.countEntities(FetchOptions.ALL);

但是没有ALL选项。那我该怎么做呢?

对于上下文,假设我想计算表格中颜色为橙色的所有条目。

如果我不能直接使用DatastoreService 执行此操作,我可以使用Datanucleus 的JPA 吗?他们是否支持 SELECT COUNT(*) ... 用于 appengine 数据存储区?

【问题讨论】:

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


    【解决方案1】:

    您可以使用以下代码计算总记录数。

    com.google.appengine.api.datastore.Query qry = new com.google.appengine.api.datastore.Query("EntityName");
    com.google.appengine.api.datastore.DatastoreService datastoreService = DatastoreServiceFactory.getDatastoreService();
    int totalCount = datastoreService.prepare(qry).countEntities(FetchOptions.Builder.withDefaults());
    

    希望对你有帮助。

    【讨论】:

    • withDefaults() 不只返回 1000 或某种限制吗?
    • withDefaults() 从实体返回总记录。是的,它也返回超过 1000 条记录,因为我已经使用此代码读取了超过 1000 条记录。
    • 确实存在 1000 个限制,但已取消。
    • 此方法有效,但它可能会超时,具体取决于您拥有的项目数量。如果有太多条目是可能的,请检查数据存储统计信息,在数据存储中保留一个计数器,或对计数器进行分片以获得正确扩展的解决方案。 blog.svpino.com/2015/03/08/…
    【解决方案2】:

    标记的答案不正确,最多1000个

    这样才能得到正确的计数

    DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
     Query query = new Query("__Stat_Kind__");
     Query.Filter eqf = new Query.FilterPredicate("kind_name",
                                Query.FilterOperator.EQUAL,
                                "MY_ENTITY_KIND");
    query.setFilter(eqf);
    Entity entityStat = ds.prepare(query).asSingleEntity();
    Long totalEntities = (Long) entityStat.getProperty("count");
    

    【讨论】:

    • 使用数据存储时遇到问题,如果您有任何使用过的帖子
    • 你遇到了什么异常?
    • 空指针异常,当我继续阅读时,他们说这不是最有效的,因为它不会给出记录的实时计数,并且它会在获得下一个总数之前像 10 小时一样更新
    • 最好的方法是分片
    • 是和否,如果您有大量数据,则分片或 map reduce 类型的实时计数不是一种有效的方法。也许在每次写入的内存缓存中保留临时计数是一个更好的主意。
    【解决方案3】:

    可以使用谷歌的DataNucleus插件,好像show support for count()

    【讨论】:

    • 感谢您的回复。我正在使用 gae-eclipse-plugin,datanucleus 是其中的一部分。我不明白你提供的链接是什么意思。您介意更正以下示例吗?:"SELECT COUNT(*) FROM items i WHERE i.color = :color"。或者该查询是否按照我的方式正确?我记得读过一些不支持* 的地方。
    • 一些 Eclipse 插件不会持久化。名为“datanucleus-appengine”的 jar 显然是 GAE 所指的 JPA,我已经为您链接了该插件的源代码,它表明它们支持 count() 那么为什么不试试呢?
    • 谢谢。 +1。我还不能测试,但据说count(p) 可以工作。
    【解决方案4】:

    这个旧的,但应该对寻求出路的新开发人员有所帮助。

    解决此问题的最佳方法是使用分片计数器技术,当您保存您知道会随时间扩展的实体时,使用分片计数器获取插入或实体组更新时的记录总数新记录,通过它您可以获得计数器的总数及其相应的计数,这些计数将相加得出数据存储表或种类中总元素的实际计数。

    使用此链接获取有关如何操作的帮助,以便更好地了解有关扩展 Web 应用程序 here 的 google i/o 2008,之后您将转到 appengine here 上的此文档,因此您将获得很快就掌握了,还有一个github例子测试。

    如需添加示例,请使用此链接Blog Tutorial,其中解释了一个简单示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 2013-06-21
      • 1970-01-01
      • 1970-01-01
      • 2016-09-25
      • 1970-01-01
      相关资源
      最近更新 更多