App Engine で特定のモデルのレコード数を取得する必要があります。どうやってそれをするのですか?
4000 を超えるレコードを一括アップロードしましたが、modelname.count() では 1000 しか表示されません。
App Engine で特定のモデルのレコード数を取得する必要があります。どうやってそれをするのですか?
4000 を超えるレコードを一括アップロードしましたが、modelname.count() では 1000 しか表示されません。
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.3.6 の時点で、count クエリの 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)
count = modelname.all(keys_only=True).count(some_upper_limit)
dar による以前の投稿に追加するだけで、この「some_upper_limit」を指定する必要があります。そうでない場合でも、デフォルトのカウントは最大 1000 のままです。
GAE では、1000 を超えるオブジェクトがある場合、カウントによって常に結果のページが表示されます。この問題に対処する最も簡単な方法は、カウンター プロパティをモデルまたは別のカウンター テーブルに追加し、新しいオブジェクトを作成するたびに更新することです。
私はまだカウントで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>')
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");