Как получить количество строк в модели Datastore в Google App Engine?

Мне нужно получить количество записей для определенной модели в App Engine. Как это сделать?

Я загружаю более 4000 записей, но modelname.count() показывает только 1000.

Ответ 1

Вам следует использовать Статистика хранилища данных:

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

Обратите внимание, что приведенное выше не работает в хранилище данных разработки, но оно работает в процессе производства (при публикации).

Я вижу, что это старый пост, но я добавляю ответ в пользу других, которые ищут одно и то же.

Ответ 2

Начиная с версии 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

Это очень старый поток, но на всякий случай это помогает другим людям, смотрящим на это, есть 3 способа сделать это:

  • Доступ к статистике хранилища данных
  • Сохранение счетчика в хранилище данных
  • Облигационные счетчики

Каждый из этих методов объясняется в этой ссылке.

Ответ 4

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

Чтобы добавить к предыдущему сообщению dar, этот параметр 'some_upper_limit' должен быть указан. Если нет, значение по умолчанию будет по-прежнему не более 1000.

Ответ 5

В GAE счет всегда будет показывать вам страницу, если у вас более 1000 объектов. Самый простой способ справиться с этой проблемой - добавить свойство счетчика к вашей модели или другой таблице счетчиков и обновить ее каждый раз, когда вы создаете новый объект.

Ответ 6

Я по-прежнему попадал в предел 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>')

Ответ 7

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

Ответ 8

Другое решение - использовать только ключевой запрос и получить размер итератора. Время вычисления с этим решением будет линейно возрастать с количеством входных данных:

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