我需要在App Engine上获取特定模型的记录数。如何做到这一点?
我批量上传了4000多条记录,但是modelname.count()只显示了1000条。
答案 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种方法可以实现这一目标:
这些方法中的每一种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));