2009-04-15 13 views

Odpowiedz

13

As wydania 1.3.6, nie ma już czapkę z 1000 zapytań policzyć. W ten sposób można wykonać następujące czynności, aby uzyskać liczbę ponad 1000:

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

To będzie liczyć wszystkie swoich jednostek, które mogą być dość powolny, jeśli masz dużą liczbę podmiotów. W rezultacie, należy rozważyć powołanie count() z jakiegoś określonego limitu:

count = modelname.all(keys_only=True).count(some_upper_bound_suitable_for_you) 
+0

Oczywiście, masz tylko 300ms, aby to zrobić :( –

+1

300ms? Skąd masz tę postać? Niezależnie od tego, jednak, to pokazuje, dlaczego liczenie obiektów w locie nie jest dobrym pomysłem. –

+0

Domyślam się miał na myśli 30 000 ms, ale tak naprawdę nie jest tak, ponieważ jeśli robisz to z powodu uploadera zbiorczego, prawdopodobnie po prostu uruchamiasz licznik na remote_api tak czy inaczej - który AFAIK nie jest objęty 30-sekundowym limitem czasu – dar

4

W GAE licznik będzie zawsze sprawiają, że poprzez stronę wyników, gdy masz ponad 1000 obiektów. Najłatwiejszym sposobem rozwiązania tego problemu jest dodanie właściwości licznika do modelu lub do innej tabeli liczników i zaktualizowanie go za każdym razem, gdy tworzysz nowy obiekt.

3

nadal hit limit 1000 z kodem hrabiego tak dostosowany Dara (kopalnia jest trochę szybki i brudny):

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>') 
7
count = modelname.all(keys_only=True).count(some_upper_limit) 

Wystarczy dodać do wcześniejszego postu dar, ten „some_upper_limit” należy określić. Jeśli nie, to liczba domyślnie będzie nadal wynosić maksymalnie 1000.

+1

Dobra odpowiedź. Sprawdziłem czas logowania i wydaje się również sensowne buforowanie wyniku memcache, jeśli aktualizacje nie są zbyt częste. –

17

Należy użyć Datastore Statistics:

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

Należy pamiętać, że powyższe nie działa na datastore rozwoju, ale to działa w produkcji (gdy opublikowano).

Widzę, że jest to stary post, ale dodaję odpowiedź na korzyść innych szukających tego samego.

+0

Otrzymuję ten błąd w pierwszym wierszu kodu: "Nie można utworzyć wystąpienia zapytania typu" Jakieś pomysły? – steven

6

Jest to bardzo stary wątek, ale tylko w przypadku pomaga inni ludzie patrząc na nią, istnieją 3 sposoby, aby tego dokonać:

  1. Dostęp do statystyk Datastore
  2. Prowadzenie licznik w magazynie danych
  3. sharding liczniki

Każda z tych metod is explained in this link.

+0

Statystyki są zbierane codziennie (a nawet co 48 godzin), zgodnie z informacjami podanymi tutaj: https://github.com/GoogleCloudPlatform/google-cloud-node/issues/413 Może się zdarzyć, że statystyki nie są zgodne rzeczywista liczba. Nawet, mówi się, że statystyki nie mogą być dostępne dla dużych zbiorów danych ... – frb

2
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

Aby wyjaśnić, zastąp "SomeEntity" nazwą, której chcesz się liczyć, wszystko inne pozostaje takie samo. Co więcej, działa to tylko podczas uruchamiania wdrożonego, entityStat wróci jako null podczas działania lokalnie. – Craigo

Powiązane problemy