2012-06-26 9 views
3

Каким образом можно обрабатывать счета в движке приложения (ndb или db)?Google App Engine подсчитывает

У меня есть два проекта на django-нереле, а другой - чистый проект django, но им нужна возможность взять запрос и получить счетчик. Результаты могут быть больше 1000.

Я видел несколько сообщений, в которых говорилось, что я могу использовать Sharded Counters, но они подсчитывают все объектов. Мне нужно, чтобы иметь возможность знать, сколько элементов имеют следующие свойства х = 1, у = True, г = 3

#Is this the appropriate way? 
count = some_entity.gql(query_string).count(SOME_LARGE_NUMBER) 
+0

Вы используете 'db' или' ndb'? – Lipis

+1

@Nix есть ли конечное/небольшое количество разных счетчиков, которые вам понадобятся, или это довольно произвольные критерии, основанные на пользовательском вводе? – Sologoub

+0

@Nix ndb намного круче, поскольку вы, возможно, уже читали об этом .. :) Но есть небольшие различия в том, как запрашивать/фильтровать материал и считать их. Я приведу вам пример. – Lipis

ответ

5

Датастор не годится такого рода запросов, из-за компромиссов, чтобы сделать его распространению , К ним относятся довольно медленные чтения и очень ограниченная индексация.

Если вам нужен ограниченный набор статистических данных (количество пользователей, статей и т. Д.), Вы можете продолжать показывать итоговые значения в отдельном объекте. Это означает, что вам нужно сделать две записи (puts), когда что-то изменится: одно для объекта, которое изменилось, и одно для обновления объекта статистики. Но вам нужно только прочитать (получить), чтобы получить свою статистику, а не как многие из них, из которых они перегоняются.

Вам может быть неудобно, потому что это противоречит тому, что мы все узнали о нормализации, но оно намного эффективнее и во многих случаях работает нормально. Вы всегда можете периодически выполнять задание cron, чтобы проверить статистику, если это важно.

3

Поскольку вы используете db.Model здесь есть один способ, как вы можете рассчитывать все свои объекты с некоторыми фильтрами, которые могут быть в течение 1000, что является жесткий предел (если он по-прежнему применимо):

FETCH_LIMIT = 1000 

def count_model(x=1, y=True, z=3): 
    model_qry = MyModel.all(keys_only=True) 
    model_qry.filter('x =', x) 
    model_qry.filter('y =', y) 
    model_qry.filter('z =', z) 

    count = None 
    total = 0 
    cursor = None 
    while count != 0: 
    if cursor: 
     count = model_qry.with_cursor(cursor).count() 
    else: 
     count = model_qry.count(limit=FETCH_LIMIT) 

    total += count 
    cursor = model_qry.cursor() 
    return total 

Если вы собираетесь использовать вышеприведенное в запросе, тогда вы можете использовать таймер, поэтому используйте вместо этого Task Queues.

Кроме того, как предлагалось FoxyLad, гораздо лучше сохранить текущие итоги в отдельном объекте по соображениям производительности и иметь вышеуказанный метод как задание cron, которое выполняется на регулярной основе, чтобы иметь статистику в идеальной синхронизации.