27

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

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

4

8 回答 8

21

您应该使用数据存储统计信息

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");

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

我看到这是一篇旧帖子,但我添加了一个答案,以帮助其他人搜索相同的内容。

于 2012-05-06T15:36:35.177 回答
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)
于 2009-04-15T12:45:05.867 回答
8

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

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

此链接中解释了这些方法中的每一种。

于 2015-03-08T16:12:27.013 回答
8
count = modelname.all(keys_only=True).count(some_upper_limit)

只是为了添加到 dar 之前的帖子,必须指定这个 'some_upper_limit'。如果不是,默认计数仍将是最大值 1000。

于 2011-05-14T09:48:13.820 回答
6

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

于 2009-05-30T03:05:58.103 回答
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>')
于 2010-11-20T21:45:26.790 回答
2

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

Datastore datastore = DatastoreOptions.getDefaultInstance().getService();
KeyFactorykeyFactory = datastore.newKeyFactory().setKind("MyKind");
Query query = Query.newKeyQueryBuilder().setKind("MyKind").build();
int count = Iterators.size(datastore.run(query));
于 2018-12-06T13:22:06.153 回答
2
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");
于 2016-03-23T15:47:54.363 回答