如何在Google App Engine中获取数据存储模型中的行数?

时间:2009-04-15 10:49:04

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

我需要在App Engine上获取特定模型的记录数。如何做到这一点?

我批量上传了4000多条记录,但是modelname.count()只显示了1000条。

8 个答案:

答案 0 :(得分:18)

您应该使用Datastore Statistics

Query query = new Query("__Stat_Kind__");
query.addFilter("kind_name", FilterOperator.EQUAL, kind);       
Entity entityStat = datastore.prepare(query).asSingleEntity();
Long totalEntities = (Long) entityStat.getProperty("count");

请注意,上述内容不适用于开发数据存储区,但它适用于生产(发布时)。

我看到这是一篇很老的帖子,但我正在为其他人搜索相同的内容而添加答案。

答案 1 :(得分:13)

从版本1.3.6开始,计数查询的上限不再为1,000。因此,您可以执行以下操作以获得超过1,000的计数:

count = modelname.all(keys_only=True).count()

这将计算您实体的所有,如果您拥有大量实体,这可能会相当慢。因此,您应该考虑使用指定的限制来调用count()

count = modelname.all(keys_only=True).count(some_upper_bound_suitable_for_you)

答案 2 :(得分:8)

count = modelname.all(keys_only=True).count(some_upper_limit)

只需要添加dar的早期帖子,就必须指定'some_upper_limit'。如果没有,默认计数仍然是最大值1000.

答案 3 :(得分:8)

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

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

答案 4 :(得分:5)

在GAE中,当您有超过1000个对象时,计数总是会让您翻阅结果。解决此问题的最简单方法是向模型或不同的计数器表添加计数器属性,并在每次创建新对象时更新它。

答案 5 :(得分:3)

我仍然按计数达到1000限制所以改编了dar的代码(我的有点快又脏):

class GetCount(webapp.RequestHandler):
    def get(self):
        query = modelname.all(keys_only=True)

        i = 0
        while True:
            result = query.fetch(1000)
            i = i + len(result)
            if len(result) < 1000:
                break
            cursor = query.cursor()
            query.with_cursor(cursor)

        self.response.out.write('<p>Count: '+str(i)+'</p>')

答案 6 :(得分:1)

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

答案 7 :(得分:0)

另一种解决方案是使用仅键查询并获取迭代器的大小。此解决方案的计算时间将随着条目数量的增加而线性增加:

Datastore datastore = DatastoreOptions.getDefaultInstance().getService();
KeyFactorykeyFactory = datastore.newKeyFactory().setKind("MyKind");
Query query = Query.newKeyQueryBuilder().setKind("MyKind").build();
int count = Iterators.size(datastore.run(query));