Что состоит в том, чтобы определить лучший способ, сколько моделей определенного вида находится в хранилище данных моего приложения? В документации говорится это MyKind.all().count()
только незначительно лучше, чем получение всех данных и имеет предел 1 000. Это не полезно, потому что я ожидаю иметь 6000 + экземпляры MyKind
сохраненный.
Существует ли лучший способ сделать это? Что, если я просто получаю ключи и считаю их?
Я использую Python.
Если приблизительный подсчет достаточно хорош, вы можете использовать API статистики:
http://code.google.com/appengine/docs/python/datastore/stats.html
Если вы используете только ключи, это должно быть довольно быстро, так как при этом нужно только читать индекс и фактически не извлекать никаких сущностей. Используйте курсор и цикл, пока count () не вернет меньше 1000.
На этот вопрос SO есть ответ (от @jgeewax), который почти правильный (неправильное условие выхода, как я там прокомментировал). Вот фиксированный ...:
class MyModel(db.Expando):
@classmethod
def count_all(cls):
"""
Count *all* of the rows (without maxing out at 1000)
"""
count = 0
query = cls.all().order('__key__')
while True:
current_count = query.count()
if current_count == 0: return count
count += current_count
if current_count == 1000:
last_key = query.fetch(1, 999)[0].key()
query = query.filter('__key__ > ', last_key)
return count
Проблема с производительностью, конечно же, в том, что при этом будет использоваться один фактический запрос к хранилищу данных на каждые 1000 имеющихся у вас элементов - денормализация вещей путем сохранения фактического количества, как предлагает @Chris , будет использовать гораздо меньше запросов. (Обязательно используйте сегментированный счетчик или другие формы эффективных счетчиков , как объясняет поклонник App Engine!).
Денормализация - это факт жизни нереляционных БД, и при правильном выполнении может огромная разница в вашей производительности. Что касается беспокойства, которое вы выражаете по поводу DRY, просто используйте методы класса или другие формы функций для выполнения всех операций вставки и удаления ваших сущностей (например, [[за исключением рассматриваемых методов класса]], никогда не вызывают методы, такие как .put ()
, непосредственно на объектах, вместо этого вызывайте соответствующие методы класса!), и эти функции будут очевидным местом для поддержания денормализованных счетчиков в актуальном состоянии!
Храните объект счетчика для вашего приложения в базе данных и обновляйте его всякий раз, когда создаете и удаляете объекты.