Una query Datastore recupera le entità da Datastore che soddisfano un insieme specificato di condizioni.
Una query tipica include quanto segue:
- Un tipo di entità a cui si applica la query
- _Filtri_ facoltativi basati sui valori delle proprietà, sulle chiavi e sui predecessori delle entità
- _Ordinamenti_ facoltativi per sequenziare i risultati
Quando viene eseguita, una query recupera tutte le entità del tipo specificato che soddisfano tutti i filtri indicati, ordinate nell'ordine specificato. Le query vengono eseguite in modalità di sola lettura.
Questa pagina descrive la struttura e i tipi di query utilizzati in App Engine per recuperare i dati da Datastore.
Filtri
I filtri di una query impostano vincoli sulle proprietà, sulle chiavi e sui predecessori delle entità da recuperare.
Filtri delle proprietà
Un filtro delle proprietà specifica
- Un nome della proprietà
- Un operatore di confronto
- Un valore della proprietà
Il valore della proprietà deve essere fornito dall'applicazione; non può fare riferimento ad altre proprietà o essere calcolato in base a queste. Un'entità soddisfa il filtro se ha una proprietà con il nome specificato il cui valore viene confrontato con il valore indicato nel filtro nel modo descritto dall'operatore di confronto.
L'operatore di confronto può essere uno dei seguenti (definiti come costanti enumerate nella classe nidificata
Query.FilterOperator):
| Operatore | Significato |
|---|---|
EQUAL |
Uguale a |
LESS_THAN |
Minore di |
LESS_THAN_OR_EQUAL |
Minore o uguale a |
GREATER_THAN |
Maggiore di |
GREATER_THAN_OR_EQUAL |
Maggiore o uguale a |
NOT_EQUAL |
Diverso da |
IN |
Membro di (uguale a uno qualsiasi dei valori in un elenco specificato) |
L'operatore NOT_EQUAL esegue in realtà due query: una in cui tutti gli altri filtri rimangono invariati e il filtro NOT_EQUAL viene sostituito da un filtro LESS_THAN e una in cui viene sostituito da un filtro GREATER_THAN. I risultati vengono poi uniti, in ordine. Una query può avere al massimo un filtro NOT_EQUAL e una query che ne ha uno non può avere altri filtri di disuguaglianza.
Anche l'operatore IN esegue più query: una per ogni elemento
nell'elenco specificato, con tutti gli altri filtri invariati e il filtro IN
sostituito da un filtro EQUAL. I risultati vengono uniti in base all'ordine
degli elementi nell'elenco. Se una query ha più di un IN filtro,
viene eseguita come più query, una per ogni combinazione possibile di valori negli
IN elenchi.
Una singola query contenente NOT_EQUAL o IN
operatori è limitata a un massimo di 30 sottoquery.
Per ulteriori informazioni su come
NOT_EQUAL e IN
query vengono tradotte in più query in un framework JDO/JPA, consulta l'articolo
Query con filtri != e IN.
Filtri principali
Per filtrare in base al valore della chiave di un'entità, utilizza la proprietà speciale Entity.KEY_RESERVED_PROPERTY:
Sono supportati anche gli ordinamenti crescenti su Entity.KEY_RESERVED_PROPERTY.
Quando si confrontano le chiavi per la disuguaglianza, vengono ordinate in base ai seguenti criteri, in ordine:
- Percorso del predecessore
- Tipo di entità
- Identificatore (nome della chiave o ID numerico)
Gli elementi del percorso del predecessore vengono confrontati in modo simile: per tipo (stringa), quindi per nome della chiave o ID numerico. I tipi e i nomi delle chiavi sono stringhe e vengono ordinati in base al valore dei byte; gli ID numerici sono numeri interi e vengono ordinati numericamente. Se le entità con lo stesso elemento principale e tipo utilizzano una combinazione di stringhe di nomi di chiavi e ID numerici, quelle con ID numerici precedono quelle con nomi di chiavi.
Le query sulle chiavi utilizzano gli indici proprio come le query sulle proprietà e richiedono indici personalizzati negli stessi casi, con un paio di eccezioni: i filtri di disuguaglianza o un ordinamento crescente sulla chiave non richiedono un indice personalizzato, ma un ordinamento decrescente sulla chiave sì. Come per tutte le query, il server web di sviluppo crea le voci appropriate nel file di configurazione dell'indice quando viene testata una query che richiede un indice personalizzato.
Filtri dei predecessori
Puoi filtrare le query Datastore in base a un predecessore specificato in modo che i risultati restituiti includano solo le entità discendenti da quel predecessore:
Tipi di query speciali
Alcuni tipi specifici di query meritano una menzione speciale:
Query senza tipo
Una query senza tipo e senza filtro del predecessore recupera tutte le entità di un'applicazione da Datastore. Sono incluse le entità create e gestite da altre funzionalità di App Engine, come le entità statistiche e entità di metadati Blobstore (se presenti). Queste query senza tipo non possono includere filtri o ordinamenti sui valori delle proprietà. Possono, tuttavia, filtrare le chiavi delle entità specificando Entity.KEY_RESERVED_PROPERTY come nome della proprietà:
Query dei predecessori
Una query con un filtro del predecessore limita i risultati all'entità specificata e ai relativi discendenti:
Query dei predecessori senza tipo
Una query senza tipo che include un filtro del predecessore recupererà il predecessore specificato e tutti i relativi discendenti, indipendentemente dal tipo. Questo tipo di query non richiede indici personalizzati. Come tutte le query senza tipo, non può includere filtri o ordinamenti sui valori delle proprietà, ma può filtrare la chiave dell'entità:
L'esempio seguente illustra come recuperare tutte le entità discendenti da un determinato predecessore:
Query basate solo su chiavi
Una query basata solo su chiavi restituisce solo le chiavi delle entità dei risultati anziché le entità stesse, con una latenza e un costo inferiori rispetto al recupero delle entità intere:
Spesso è più economico eseguire prima una query basata solo su chiavi e poi recuperare un sottoinsieme di entità dai risultati, anziché eseguire una query generale che potrebbe recuperare più entità di quelle effettivamente necessarie.
Query di proiezione
A volte tutto ciò che ti serve dai risultati di una query sono i valori di alcune proprietà specifiche. In questi casi, puoi utilizzare una query di proiezione per recuperare solo le proprietà che ti interessano effettivamente, con una latenza e un costo inferiori rispetto al recupero dell'intera entità; per i dettagli, consulta la pagina Query di proiezione.
Ordinamenti
Un ordinamento di una query specifica
- Un nome della proprietà
- Una direzione di ordinamento (crescente o decrescente)
Ad esempio:
Se una query include più ordinamenti, questi vengono applicati nella sequenza specificata. L'esempio seguente ordina prima in base al cognome in ordine crescente e poi in base all'altezza in ordine decrescente:
Se non vengono specificati ordinamenti, i risultati vengono restituiti nell'ordine in cui vengono recuperati da Datastore.
Nota: a causa del modo in cui Datastore esegue le query, se una query specifica filtri di disuguaglianza su una proprietà e ordinamenti su altre proprietà, la proprietà utilizzata nei filtri di disuguaglianza deve essere ordinata prima delle altre proprietà.
Indici
Ogni query Datastore calcola i risultati utilizzando uno o più indici, che contengono le chiavi delle entità in una sequenza specificata dalle proprietà dell'indice e, facoltativamente, dai predecessori dell'entità. Gli indici vengono aggiornati in modo incrementale per riflettere le modifiche apportate dall'applicazione alle relative entità, in modo che i risultati corretti di tutte le query siano disponibili senza ulteriori calcoli.
App Engine predefinisce un indice semplice su ogni proprietà di un'entità.
Un'applicazione App Engine può definire ulteriori indici personalizzati in un
file di configurazione dell'indice denominato
datastore-indexes.xml,
generato nella directory /war/WEB-INF/appengine-generated dell'applicazione
. Il server di sviluppo aggiunge automaticamente i suggerimenti a questo file quando rileva query che non possono essere eseguite con gli indici esistenti.
Puoi ottimizzare gli indici manualmente modificando il file prima di caricare l'applicazione.
Esempio di interfaccia di query
L'API Datastore Java di basso livello fornisce la classe Query per la creazione di query e l'interfaccia PreparedQuery per il recupero delle entità da Datastore:
Nota l'utilizzo di FilterPredicate e CompositeFilter per creare i filtri. Se imposti un solo filtro su una query, puoi utilizzare solo FilterPredicate:
Tuttavia, se vuoi impostare più di un filtro su una query, devi utilizzare CompositeFilter, che richiede almeno due filtri. L'esempio precedente utilizza l'helper di scorciatoia CompositeFilterOperator.and; l'esempio seguente mostra un modo per creare un filtro OR composto:
Passaggi successivi
- Scopri come specificare cosa restituisce una query e controllare ulteriormente i risultati della query.
- Scopri le limitazioni comuni per le query su Datastore.
- Scopri di più sui cursori delle query, che consentono a un'applicazione di recuperare i risultati di una query in batch convenienti.
- Comprendi la coerenza dei dati e come funziona la coerenza dei dati con i diversi tipi di query su Datastore.