Как получить количество строк в модели хранилища данных в Google App Engine? - PullRequest
24 голосов
/ 15 апреля 2009

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

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

Ответы [ 8 ]

18 голосов
/ 06 мая 2012

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

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

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

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

13 голосов
/ 15 апреля 2009

Начиная с версии 1.3.6, количество запросов на количество запросов больше не ограничено 1000. Таким образом, вы можете сделать следующее, чтобы получить счет больше 1000:

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

Это подсчитает всех ваших сущностей, что может быть довольно медленным, если у вас есть большое количество сущностей. В результате вам следует рассмотреть возможность вызова count() с указанным ограничением:

count = modelname.all(keys_only=True).count(some_upper_bound_suitable_for_you)
8 голосов
/ 08 марта 2015

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

  1. Доступ к статистике хранилища данных
  2. Хранение счетчика в хранилище данных
  3. Счетчики Sharding

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

8 голосов
/ 14 мая 2011
count = modelname.all(keys_only=True).count(some_upper_limit)

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

5 голосов
/ 30 мая 2009

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

3 голосов
/ 21 ноября 2010

Я все еще достиг предела в 1000 с таким количеством адаптированного кода Дара (мой немного быстрый и грязный):

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>')
1 голос
/ 23 марта 2016
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");
0 голосов
/ 06 декабря 2018

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

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