Мне нужно получить количество записей для определенной модели в App Engine. Как это сделать?
Я загружаю более 4000 записей, но modelname.count() показывает только 1000.
Мне нужно получить количество записей для определенной модели в App Engine. Как это сделать?
Я загружаю более 4000 записей, но modelname.count() показывает только 1000.
Вам следует использовать Статистика хранилища данных:
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, больше нет кол-ва 1000 запросов count. Таким образом, вы можете сделать следующее, чтобы получить счет за пределами 1000:
count = modelname.all(keys_only=True).count()
Это будет считать все ваши сущности, которые могут быть довольно медленными, если у вас есть большое количество объектов. В результате вы должны подумать о вызове count()
с заданным ограничением:
count = modelname.all(keys_only=True).count(some_upper_bound_suitable_for_you)
Это очень старый поток, но на всякий случай это помогает другим людям, смотрящим на это, есть 3 способа сделать это:
Каждый из этих методов объясняется в этой ссылке.
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");
Другое решение - использовать только ключевой запрос и получить размер итератора. Время вычисления с этим решением будет линейно возрастать с количеством входных данных:
Datastore datastore = DatastoreOptions.getDefaultInstance().getService();
KeyFactorykeyFactory = datastore.newKeyFactory().setKind("MyKind");
Query query = Query.newKeyQueryBuilder().setKind("MyKind").build();
int count = Iterators.size(datastore.run(query));