2009-04-28 11 views
12

Duplikat"how does one get a count of rows in a datastore model in google appengine?"Google AppEngine: jak policzyć wpisy bazy danych powyżej 1000?


chcę wiedzieć, ilu użytkowników, co mam. Wcześniej udało mi się to osiągnąć za pomocą następującego kodu:

users = UserStore.all() 
user_count = users.count() 

Ale teraz mam ponad 1000 użytkowników i ta metoda zwraca 1000.

Czy istnieje skuteczny programowy sposób sprawdzenia, ilu użytkowników mam?

Odpowiedz

14

To rzeczywiście jest duplikat, a drugi post opisuje, jak teoretycznie to zrobić, ale chciałbym podkreślić, że tak naprawdę nie powinieneś robić tego w ten sposób. Powodem jest to, że BigTable według jego rozproszonego charakteru jest naprawdę złe dla agregatów. Najprawdopodobniej chcesz dodać licznik transakcyjny do tej jednostki, a jeśli jest dużo transakcji, to jest to sharded counter. Zobacz: http://code.google.com/appengine/articles/sharding_counters.html

UPDATE: Ponieważ 1.3.1 kursory dokonać rzeczy tak dużo łatwiejsze: http://code.google.com/appengine/docs/python/datastore/queriesandindexes.html#Query_Cursors

+2

+1000. Liczenie każdego użytkownika na każde żądanie jest naprawdę złym pomysłem. –

+0

Skończyło się na implementacji tego! Dzięki milionowi, moja wydajność znacznie się poprawiła (: –

+0

Innym sposobem na osiągnięcie tego bez konieczności implementowania sharding counters jest uzyskanie dostępu do statystyk Datastore. Oto pełne wyjaśnienie 3 metod zliczania liczby wpisów dla określonego typu: https://blog.svpino.com/2015/03/08/how-to-count-all-entries-of-a-given-type-in-the-app-engine-datastore – svpino

2

Użyj paginacji takich jak te przykłady here.

0

mam napisać ten sposób liczyć kwerendy, ale jak powiedział Nick Johnson może to zły pomysł ...

def query_counter (q, cursor=None, limit=500): 
    if cursor: 
     q.with_cursor (cursor) 
    count = q.count (limit=limit) 
    if count == limit: 
     return count + query_counter (q, q.cursor(), limit=limit) 
    return count 
2

od wersji 1.3.6 SDK granica 1000 funkcję zliczania został usunięty. Zatem wywołanie funkcji liczenia zwróci teraz dokładną liczbę jednostek, nawet jeśli jest ich więcej niż 1000. Jedynie ograniczenie byłoby, gdybyś miał tyle podmiotów, że funkcja liczenia nie powróciłaby, zanim żądanie przekroczy limit czasu.

+0

Zamiast używać count() , a co powiesz na temat używania len()? Sprawdź tutaj: http://alwaysthecritic.typepad.com/atc/2009/02/google-app-engine-query-and-querycount.html – DocWiki

+0

Ta metoda była od czasu miał limit 1000. –

Powiązane problemy