【问题标题】:Objectify/AppEngine: best way to count # of objects returned by a query?Objectify/AppEngine:计算查询返回的对象数的最佳方法?
【发布时间】:2011-06-29 21:41:53
【问题描述】:

AppEngine 上使用 Objectify 计算查询返回的对象数量的最佳(即最有效)方法是什么,无需实际加载它们?我猜最好的办法是获取所有密钥并计算结果:

public int getEntityCount(Long v) {
    Objectify ofy = ObjectifyService.begin();
    Iterable<Key<MyEntity>> list = ofy.query(MyEntity.class)
            .filter("field", v).fetchKeys();
    int n = 0;
    for (Key<MyEntity> e : list)
        n++;
    return n;
}

似乎没有任何专门的方法可以做到这一点。有什么想法吗?

【问题讨论】:

    标签: google-app-engine objectify


    【解决方案1】:

    找到了:

    int n = Iterable<Key<MyEntity>> list = ofy().query(MyEntity.class)
          .filter("field", v).count();
    

    它很简单,但很有效,因为它会检索所有的键。最好设计您的 UI 来处理未知数量的结果(例如 Google,它提供了页数的线索,但不提供实际数量)

    【讨论】:

    • 请记住,计算实体总是低效的 - O(n) 时间。如果你预计会有很多,你应该保持一个持久的计数。
    • 有点效率低下,但至少它不获取实体,只是键,对吧?就我而言,可能有很多“MyEntity”对象,但过滤器数量从来没有那么大(
    • 这种方式是不是一次获取的item数量有问题?我尝试过类似的方法,但它最终不起作用,因为最大计数为 1000(开发服务器)。
    • 您应该始终通过其静态方法 ofy() 访问 ofy,而不是保留对它的引用。
    • 对 v4 是正确的,但是当 v3 仍然是最新版本并且该代码遵循 v3 文档编码样式时提出了问题。现在在 v4 中,这是不好的做法,但不是错误的......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多