2014-02-25 3 views
2

Каков наилучший способ получить только счет результата запроса NDB? (с меньшей операцией чтения)Лучший способ получить счет NDB-запроса - App Engine

Какой из них более эффективен для подсчета результатов запроса NDB? Обычный запрос или Проекция запроса:

EmailSent.query(EmailSent.unsub==True, EmailSent.mail_ref==mail_ref, projection=['to_email']).count()

EmailSent.query(EmailSent.unsub==True, EmailSent.mail_ref==mail_ref).count()

я нашел такой же вопрос здесь: Get NDB query length - using Python on Google App Engine, но для получения первого результата запроса.

ответ

7

Операция count.

https://developers.google.com/appengine/docs/python/ndb/queryclass#Query_count

count(limit=None, **q_options)

Возвращает число результатов запроса, до до предела. Это возвращает тот же результат, что и len (q.fetch (limit)), но более эффективно.

+4

Остерегайтесь, потому что «более эффективным» в этом случае будет только постоянный коэффициент. Это будет время и будет считаться пропорциональным длине запроса, поскольку appengine просматривает индекс. Будет также тайм-аут на очень больших результатах, вам нужно будет сделать его разбитым на страницы. –

2

Использование count. Незначительные различия в эффективности, если вы можете разбивать на страницы.

list_of_emails = EmailSent.query(EmailSent.unsub==True) 
total_count = list_of_emails.count() 

offset = int(args['offset']) 
limit = int(args['limit']) 

list_of_emails, next_cursor, more = list_of_emails.fetch_page(limit, offset=offset) 

prev_offset = max(offset - limit, 0) 
prev = True if offset else False 
next_ = True if more else False 
next_offset = '' 
if next_: 
    next_offset = offset + limit 

objects = map(lambda emails: func(emails), list_of_emails) 
     return {'objects': objects, 'total_count': total_count, 'prev': prev, 'next': next_, 'prev_offset': prev_offset, 
       'next_offset': next_offset} 
Смежные вопросы