2009-05-21 8 views
5

Quello che sto cercando essenzialmente è questo SQL tradotto in Google AppEngine (per Java) termini:Come posso ottenere un conteggio di tutte le voci di un determinato tipo memorizzate nell'archivio dati di Google Appengine?

select count(*) from Customers 

Sembra abbastanza semplice, ma dalla lettura della documentazione, sembra che avrei dovuto eseguire una query che corrisponde a tutti i clienti, li registra e conta i risultati, tenendo conto dell'impaginazione. Non voglio recuperare ogni singolo elemento, voglio solo contarli.

In alternativa, c'era un'API per eseguire il loop su tutte le voci di un determinato tipo (al momento non è possibile trovare l'API esatta). Questo sembra essere abbastanza inefficiente, per non parlare del fatto che le chiamate datastore hanno anche una quota limitata.

Eventuali suggerimenti sarebbero apprezzati.

Grazie, Mark

risposta

1

Purtroppo, è impossibile per BigTable contare entità, senza l'esecuzione di query per soddisfare tutti loro. Tenendo presente che applicazioni come Ricerca Google e Google Reader non ti daranno nemmeno conteggi esatti per i risultati quando ne hai più di 1000, se pensi assolutamente di aver bisogno di contare tutte le tue entità, potresti fare una serie di keys_only query limitate a 1000 entità ciascuna e sommano i conteggi per tutte loro.

0

Questa è solo una speculazione, ma penso che implementeranno un metodo count() in java simile alla loro implementazione python. HERE è il metodo count() per python.

count (limite)

Returns the number of results this query fetches. 

count() is somewhat faster than retrieving all of the data by a constant factor, but the running time still grows with the size of the result set. It's best to only use count() in cases where the count is expected to be small, or specify a limit. 

Note: count() returns a maximum of 1000. If the actual number of entities that match the query criteria exceeds the maximum, count() returns a count of 1000. 

Arguments: 

limit 

    The maximum number of results to count. 
+0

restituirà un conteggio accurato quando ci sono> 1000 risultati? –

8

Come wooble dice, bigtable non supporta conteggi delle righe come un concetto fondamentale - è possibile scrivere una funzione wrapper, come mcotton dice, ma, come egli cita dal documenti, che saranno ancora limitati a 1000 al massimo.

Per superare questi limiti è necessario mantenere, per ogni tipo di entità che si desidera contare, un contatore che viene incrementato ogni volta che viene inserita una nuova entità di quel tipo, decrementata quando un'entità di quel tipo viene eliminata.

Per mantenere la tua app altamente scalabile probabilmente vorrai suddividere questi contatori, vedi http://code.google.com/appengine/articles/sharding_counters.html (sfortunatamente non sono a conoscenza di una traduzione di quella ricetta in Java, ma i concetti dovrebbero essere gli stessi).

3

Come detto da mcotton, sembra che count() su una query "SELECT __ key __" senza limite possa fare ciò che si desidera.

http://code.google.com/appengine/docs/python/datastore/queryclass.html#Query_count

Questa è una relativamente nuova funzionalità di Google Datastore però. Avevano un limite obbligatorio di 1000 su questo. Hanno rimosso solo di recente quel limite. L'unico limite ora è se la query viene eseguita abbastanza velocemente da non scadere.

C'è anche la nuova API di Google Mapper da prendere in considerazione se si tratta di una quantità enorme di dati e si raggiungono i timeout. Per saperne di più, fai una ricerca su Google per [appengine mapreduce].

Sono d'accordo sul fatto che GQL non supporta "SELECT COUNT (*)". Sembra un po 'di supervisione. Ma fare una selezione solo sulla chiave e poi usare count() per non inviare quei tasti fino all'app dovrebbe comportarsi allo stesso modo.

0

Questa è una discussione molto vecchio, ma solo nel caso in cui aiuta altre persone a guardarla, ci sono 3 modi per ottenere questo:

  1. Accesso alle statistiche datastore
  2. Mantenere un contatore nel datastore
  3. contatori di condivisione

Ognuno di questi metodi is explained in this link.

Problemi correlati