Datastore fornisce accesso programmatico ad alcuni dei suoi metadati per supportare la metaprogrammazione, implementare funzioni amministrative di backend, semplificare la memorizzazione nella cache coerente e scopi simili. Puoi utilizzarlo, ad esempio, per creare un visualizzatore Datastore personalizzato per la tua applicazione. I metadati disponibili includono informazioni su gruppi di entità, spazi dei nomi, tipi di entità e proprietà utilizzati dalla tua applicazione, nonché le rappresentazioni delle proprietà per ogni proprietà.
La dashboard di Datastore nella console Google Cloud fornisce anche alcuni metadati sulla tua applicazione, ma i dati visualizzati sono diversi per alcuni aspetti importanti da quelli restituiti da queste funzioni.
- Aggiornamento. La lettura dei metadati tramite l'API restituisce i dati attuali, mentre i dati della dashboard vengono aggiornati solo una volta al giorno.
- Sommario. Alcuni metadati nella dashboard non sono disponibili tramite le API; è vero anche il contrario.
- Velocità. I dati ricevuti e le query vengono fatturati allo stesso modo Datastore ottiene e query. Le query sui metadati che recuperano informazioni su spazi dei nomi, tipi e proprietà sono generalmente lente da eseguire. Come regola generale, una query sui metadati che restituisce N entità richiede circa lo stesso tempo di N query ordinarie che ciascuna restituisce una singola entità. Inoltre, query di rappresentazione delle strutture (query di proprietà non solo chiavi) sono più lente di query sulla proprietà solo per chiavi. I metadati dei gruppi di entità sono leggermente più veloci rispetto a quelli di un'entità normale.
Metadati del gruppo di entità
Cloud Datastore fornisce l'accesso alla "versione" di un'entità gruppo, un numero assolutamente positivo che è garantito in aumento a ogni modifica al gruppo di entità.
Le versioni dei gruppi di entità vengono ottenute chiamando get()
su una pseudo-entità speciale
che contiene una proprietà __version__
strettamente positiva. Lo pseudo-entità
puoi creare la chiave utilizzando
Metodo Entities.createEntityGroupKey()
:
Comportamento legacy
Nel comportamento precedente della versione del gruppo di entità, la versione del gruppo di entità aumenta solo in caso di modifiche al gruppo di entità. Il comportamento precedente dei metadati dei gruppi di entità potrebbe essere utilizzato, ad esempio, per mantenere una cache coerente di una query sull'antenato complessa in un gruppo di entità.
Questo esempio memorizza nella cache i risultati della query (un conteggio dei risultati corrispondenti) e utilizza la classe comportamento precedente delle versioni dei gruppi di entità per utilizzare il valore memorizzato nella cache, se attuale:
__entity_group__
entità potrebbero non esistere per gruppi di entità che non hanno mai
in cui è stata scritta.
Query dei metadati
La classe Java
Entities
,
definita nel
pacchetto
com.google.appengine.api.datastore
, fornisce tre tipi di entità speciali riservati alle query dei metadati. Sono indicate dalle costanti statiche della classe Entities
:
Costante statica | Tipo di entità |
---|---|
Entities.NAMESPACE_METADATA_KIND |
__namespace__ |
Entities.KIND_METADATA_KIND |
__kind__ |
Entities.PROPERTY_METADATA_KIND |
__property__ |
Questi tipi non saranno in conflitto con altri nomi con gli stessi nomi che potrebbero esistere già nella tua applicazione. Eseguendo query su questi tipi speciali, puoi recuperare le entità contenenti i metadati desiderati.
Le entità restituite dalle query sui metadati vengono generate dinamicamente, in base a
lo stato attuale di Datastore. Anche se puoi creare contenuti
Entity
oggetti di tipo __namespace__
, __kind__
o
__property__
, qualsiasi
il tentativo di archiviarle in Datastore avrà esito negativo
con un
IllegalArgumentException
di Google.
Il modo più semplice per inviare query sui metadati è tramite API Datastore di basso livello. L'esempio seguente stampa i nomi di tutti gli spazi dei nomi di un'applicazione:
Query sullo spazio dei nomi
Se la tua applicazione utilizza l'API Namespaces, puoi utilizzare una query sullo spazio dei nomi per trovare tutti gli spazi dei nomi utilizzati nelle entità dell'applicazione. Ciò ti consente di svolgere attività come funzioni amministrative in più spazi dei nomi.
Le query dello spazio dei nomi restituiscono entità di tipo speciale __namespace__
la cui chiave
name è il nome di uno spazio dei nomi. Un'eccezione è lo spazio dei nomi predefinito designato dalla stringa vuota ""
: poiché la stringa vuota non è un nome di chiave valido, questo spazio dei nomi è associato all'ID numerico 1
. Le query di questo
tipo supportano il filtro solo per gli intervalli della pseudoproprietà
__key__
speciale, il cui valore è la chiave dell'entità. I risultati possono essere ordinati in base al valore __key__
crescente (ma non decrescente). Poiché __namespace__
entità
non hanno proprietà, le query solo chiavi e non solo chiavi restituiscono lo stesso
informazioni.
L'esempio seguente restituisce un elenco degli spazi dei nomi di un'applicazione nell'intervallo tra due nomi specificati, start
e end
:
Query sui tipi
Le query di tipo restituiscono entità di tipo __kind__
il cui nome della chiave è il nome della
un tipo di entità. Le query di questo tipo sono limitate implicitamente allo spazio dei nomi corrente e supportano l'applicazione di filtri solo per gli intervalli della pseudoproprietà __key__
. I risultati possono essere ordinati in base al valore __key__
crescente (ma non decrescente). Poiché le entità __kind__
non hanno proprietà, vengono utilizzate solo entrambe le chiavi
e non solo chiavi restituiscono le stesse informazioni.
Il seguente esempio stampa tutti i tipi i cui nomi iniziano con una lettera minuscola:
Query relative alla struttura
Le query di proprietà restituiscono entità di tipo __property__
che indicano
e le proprietà associate a un tipo di entità. L'entità che rappresenta la proprietà P di tipo K viene creata nel seguente modo:
- La chiave dell'entità ha il tipo
__property__
e il nome della chiave P. - La chiave dell'entità principale ha il tipo
__kind__
e il nome della chiave K.
Il comportamento di una query sulla proprietà dipende dal fatto che si tratti o meno di una query soltanto chiavi o un solo non chiavi (rappresentazione della proprietà) query, come descritto nelle sottosezioni di seguito.
Query proprietà: solo chiavi
Le query sulle proprietà solo chiavi restituiscono una chiave per ogni proprietà indicizzata di un tipo di entità specificato. Le proprietà non indicizzate non sono incluse. L'esempio seguente stampa i nomi di tutti i tipi di entità di un'applicazione e le proprietà associate a ciascuna:
Le query di questo tipo sono implicitamente limitate allo spazio dei nomi corrente e
supportano l'applicazione di filtri solo per intervalli al di sopra della pseudoproprietà __key__
, in cui
i tasti indicano entità __kind__
o __property__
. I risultati possono essere ordinati in base al valore __key__
crescente (ma non decrescente). Il filtro viene applicato alle coppie tipo-proprietà, ordinate prima per tipo e poi per proprietà: ad esempio, supponiamo di avere un'entità con queste proprietà:
- tipo
Account
con proprietàbalance
company
- tipo
Employee
con proprietàname
ssn
- tipo
Invoice
con proprietàdate
amount
- tipo
Manager
con proprietàname
title
- tipo
Product
con proprietàdescription
price
La query per restituire i dati della proprietà avrebbe il seguente aspetto:
La query riportata sopra restituirà quanto segue:
Employee: ssn
Invoice: date
Invoice: amount
Manager: name
Tieni presente che i risultati non includono la proprietà name
di tipo Employee
e la proprietà title
di tipo Manager
, né le proprietà di tipi
Account
e Product
, perché non rientrano nell'intervallo specificato per la
query.
Le query sulle proprietà supportano anche i filtri degli antenati su una chiave __kind__
o
__property__
per limitare i risultati della query a un singolo tipo o proprietà. Puoi utilizzarlo, ad esempio, per recuperare le proprietà associate a un determinato tipo di entità, come nell'esempio seguente:
Query della proprietà: solo non chiavi (rappresentazione della proprietà)
Query su proprietà non solo chiavi, note come query di rappresentazione della proprietà,
restituiscono informazioni aggiuntive sulle rappresentazioni utilizzate da ogni proprietà "kind"
. Le proprietà non indicizzate non sono incluse. L'entità restituita per la proprietà
P di tipo K ha la stessa chiave di una corrispondente
query solo chiavi,
oltre a una proprietà property_representation
aggiuntiva che restituisce le rappresentazioni della proprietà. Il valore di questa proprietà è un'istanza della classe
java.util.Collection<String>
contenente una stringa per ogni rappresentazione della proprietà
P trovata in qualsiasi entità di tipo K.
Tieni presente che le rappresentazioni non sono uguali ai classi di proprietà; più classi di proprietà possono essere associate alla stessa rappresentazione. Ad esempio,
java.lang.String
e
com.google.appengine.api.datastore.PhoneNumber
utilizzano entrambi la rappresentazione STRING
.
La seguente tabella mappa le classi di proprietà alle relative rappresentazioni:
Classe di proprietà | Rappresentazione |
---|---|
java.lang.Byte |
INT64 |
java.lang.Short |
INT64 |
java.lang.Integer |
INT64 |
java.lang.Long |
INT64 |
java.lang.Float |
DOUBLE |
java.lang.Double |
DOUBLE |
java.lang.Boolean |
BOOLEAN |
java.lang.String |
STRING |
com.google.appengine.api.datastore.ShortBlob |
STRING |
java.util.Date |
INT64 |
com.google.appengine.api.datastore.GeoPt |
POINT |
com.google.appengine.api.datastore.PostalAddress |
STRING |
com.google.appengine.api.datastore.PhoneNumber |
STRING |
com.google.appengine.api.datastore.Email |
STRING |
com.google.appengine.api.users.User |
USER |
com.google.appengine.api.datastore.IMHandle |
STRING |
com.google.appengine.api.datastore.Link |
STRING |
com.google.appengine.api.datastore.Category |
STRING |
com.google.appengine.api.datastore.Rating |
INT64 |
com.google.appengine.api.datastore.Key |
REFERENCE |
com.google.appengine.api.blobstore.BlobKey |
STRING |
java.util.Collection<T> |
Rappresentazione di T |
L'esempio seguente trova tutte le rappresentazioni di una proprietà specificata per un tipo di entità specificato: