Una query di Datastore recupera entità da Cloud 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 su valori, chiavi e antenati delle proprietà delle entità
- (Facoltativo) Ordini di ordinamento per ordinare i risultati
Questa pagina descrive la struttura e i tipi di query utilizzati in App Engine per recuperare i dati da Cloud Datastore.
Filtri
I filtri di una query impostano vincoli sulle proprietà, sulle chiavi e sugli antenati delle entità da recuperare.
Filtri proprietà
Un filtro proprietà specifica
- Un nome di proprietà
- Un operatore di confronto
- Un valore della proprietà
Il valore della proprietà deve essere fornito dall'applicazione. a cui non può fare riferimento calcolato in termini di altre proprietà. Un'entità soddisfa il filtro se ha una proprietà del nome specificato il cui valore è confrontato con quello specificato il 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
NOT_EQUAL
filtro viene sostituito da un
LESS_THAN
filtro e un'altra in cui viene sostituito da un
GREATER_THAN
filtro. I risultati vengono quindi uniti, in ordine. Una query può avere al massimo
NOT_EQUAL
e una query con uno non può avere altri filtri di disuguaglianza.
L'operatore IN
esegue anche più query: una per ogni elemento nell'elenco specificato, con tutti gli altri filtri invariati e il filtro IN
sostituito con un
EQUAL
filtro. I risultati vengono uniti in base agli elementi nell'elenco. Se una query contiene più di un filtro IN
, viene eseguita come più query, una per ogni possibile combinazione di valori negli elenchi IN
.
Una singola query contenente
NOT_EQUAL
o IN
è limitato a un massimo di 30 sottoquery.
Per ulteriori informazioni
NOT_EQUAL
e IN
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 supportate anche le ordinamento in ordine crescente per Entity.KEY_RESERVED_PROPERTY
.
Quando si esegue il confronto per verificare l'ineguaglianza, le chiavi vengono ordinate in base ai seguenti criteri:
- Percorso predecessore
- Tipo di entità
- Identificatore (nome chiave o ID numerico)
Gli elementi del percorso predecessore vengono confrontati in modo simile: per tipo (stringa), per nome della chiave o ID numerico. I tipi e i nomi delle chiavi sono stringhe e sono ordinati in base al valore in byte; gli ID numerici sono numeri interi e sono ordinati in ordine numerico. Se le entità con lo stesso elemento principale e lo stesso 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 esattamente come le query sulle proprietà e richiedono indici personalizzati negli stessi casi, con un paio di eccezioni: i filtri o un ordinamento crescente sulla chiave non richiedono un indice personalizzato, un ordinamento decrescente sulla chiave. Come per tutte le query, il server web di sviluppo crea voci appropriate nel file di configurazione dell'indice quando viene testata una query che richiede un indice personalizzato.
Filtri predecessori
Puoi filtrare le query di Datastore in base a un antenato specificato, in modo che i risultati restituiti includano solo le entità che discendono da quell'antenato:
Tipi di query speciali
Alcuni tipi specifici di query meritano una menzione speciale:
Query senza tipo
Una query senza tipo e senza filtro di antenato recupera tutte le entità di un'applicazione da Datastore. Sono incluse le entità create e gestite da altre funzionalità di App Engine, ad esempio le entità statistiche e le entità di metadati di Blobstore (se presenti). Queste query senza tipo non possono includere filtri o ordini di ordinamento in base ai valori delle proprietà. Tuttavia, possono filtrare in base alle chiavi delle entità specificando Entity.KEY_RESERVED_PROPERTY
come nome della proprietà:
Query sui predecessori
Una query con un filtro predecessore limita i risultati all'entità specificata e ai suoi discendenti:
Query predecessori Kindless
Una query senza tipo che include un filtro predecessore recupererà predecessore e tutti i suoi discendenti, indipendentemente dal tipo. Questo tipo di query non richiede indici personalizzati. Come per tutte le query senza tipo, non può includere filtri oppure ordinare in base ai valori delle proprietà, ma puoi applicare filtri in base alla chiave dell'entità:
L'esempio seguente illustra come recuperare tutte le entità discendenti da un determinato antenato:
Query basate solo su chiavi
Una query basata solo su chiavi restituisce solo le chiavi delle entità di risultato anziché le entità stesse, con una latenza e un costo inferiori rispetto al recupero di 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 generica che potrebbe recuperare più entità di quelle di cui hanno davvero bisogno.
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 maggiori dettagli, consulta la pagina Query di proiezione.
Ordinare gli ordini
Un ordinamento di query specifica
- Il nome di una proprietà
- Una direzione di ordinamento (crescente o decrescente)
Ad esempio:
Se una query include più ordini di ordinamento, questi vengono applicati nella sequenza specificata. L'esempio seguente ordina prima per cognome in ordine crescente e poi per altezza in ordine decrescente:
Se non vengono specificati ordini di ordinamento, 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 per una proprietà e ordini di ordinamento per altre proprietà, la proprietà utilizzata nei filtri di disuguaglianza deve essere ordinata prima delle altre proprietà.
Indici
Ogni query di 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 eventuali modifiche apportate dall'applicazione alle sue 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
,
che viene generato nella directory /war/WEB-INF/appengine-generated
dell'applicazione.
Il server di sviluppo esegue automaticamente
aggiunge suggerimenti a questo file quando rileva query che non possono essere eseguite con gli indici esistenti.
Puoi ottimizzare manualmente gli indici 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 costruzione di query e l'interfaccia PreparedQuery
per il recupero delle entità da Datastore:
Tieni presente l'utilizzo di FilterPredicate
e CompositeFilter
per creare filtri. Se imposti un solo filtro per una query, puoi utilizzare FilterPredicate
da solo:
Tuttavia, se vuoi impostare più di un filtro per una query, devi utilizzare CompositeFilter
, che richiede almeno due filtri. L'esempio riportato sopra utilizza l'helper di scorciatoia CompositeFilterOperator.and
; l'esempio seguente mostra un modo per creare un filtro OR composito:
Passaggi successivi
- Scopri come specificare cosa restituisce una query e come controllare ulteriormente i risultati.
- Scopri le limitazioni comuni per le query su Cloud Datastore.
- Scopri di più sui cursori di query, che consentono a un'applicazione di recuperare i risultati di una query in comodi batch.
- Comprendi la coerenza dei dati e il funzionamento della coerenza dei dati con diversi tipi di query su Cloud Datastore.