Datastore bietet programmgesteuerten Zugriff auf einige seiner Metadaten, um die Metaprogrammierung zu unterstützen, Backend-Verwaltungsfunktionen zu implementieren, konsistentes Caching zu vereinfachen und ähnliche Zwecke zu erfüllen. Sie können beispielsweise einen benutzerdefinierten Datastore-Betrachter für Ihre Anwendung erstellen. Die verfügbaren Metadaten umfassen Informationen zu den Entitätsgruppen, Namespaces, Entitätsarten und Attributen, die Ihre Anwendung verwendet, sowie die Attributdarstellungen für die einzelnen Attribute.
Das Datastore-Dashboard in der Google Cloud Console stellt auch einige Metadaten zu Ihrer Anwendung bereit. Die hier angezeigten Daten unterscheiden sich jedoch in einigen wichtigen Bereichen von den Daten, die von diesen Funktionen zurückgegeben werden.
- Aktualität. Wenn Metadaten mit der API gelesen werden, werden aktuelle Daten abgerufen. Daten im Dashboard werden nur einmal täglich aktualisiert.
- Inhalt. Einige Metadaten im Dashboard sind über die APIs nicht verfügbar und umgekehrt.
- Geschwindigkeit. Metadatenabrufe und -abfragen werden wie Datenspeicherabrufe und -abfragen abgerechnet. Die Ausführung von Metadatenabfragen, die Informationen zu Namespaces, Arten und Attributen abrufen, ist im Allgemeinen langsam. Als Faustregel gehen Sie davon aus, dass eine Metadatenabfrage, die n Entitäten zurückgibt, etwa genauso lange dauert wie n normale Abfragen, die jeweils eine einzelne Entität zurückgeben. Außerdem sind Attributdarstellungsabfragen (nicht ausschließlich schlüsselbasierte Attributabfragen) langsamer als ausschließlich schlüsselbasierte Attributabfragen. Abrufe von Metadaten aus Entitätengruppen sind etwas schneller als Abrufe aus regulären Entitäten.
Metadaten aus Entitätengruppen
Cloud Datastore bietet Zugriff auf die "Version" einer Entitätengruppe, eine strikt positive Zahl, die sich bei jeder Änderung der Entitätengruppe garantiert erhöht.
Entitätengruppenversionen werden durch das Aufrufen von get()
für eine spezielle Pseudoentität abgerufen, die ein strikt positives __version__
-Attribut enthält. Der Schlüssel der Pseudoentität kann mit der Methode Entities.createEntityGroupKey()
erstellt werden:
Legacy-Verhalten
Im Versionsverhalten der Legacy-Entitätengruppe wird die Version der Entitätengruppe nur bei Änderungen an der Entitätengruppe erhöht. Das Metadatenverhalten der Legacy-Entitätengruppen könnte beispielsweise dazu verwendet werden, einen konsistenten Cache einer komplexen Ancestor-Abfrage für eine Entitätengruppe beizubehalten.
In diesem Beispiel werden Abfrageergebnisse im Cache gespeichert (Anzahl der übereinstimmenden Ergebnisse) und das Legacy-Verhalten von Entitätengruppenversionen verwendet, um den im Cache gespeicherten Wert zu verwenden, wenn er aktuell ist:
__entity_group__
-Entitäten sind möglicherweise nicht für Entitätengruppen vorhanden, in die noch nie geschrieben wurde.
Metadatenabfragen
Die im Paket com.google.appengine.api.datastore
definierte Java-Klasse Entities
bietet drei spezielle Entitätstarten, die für Metadatenabfragen reserviert sind. Sie werden durch statische Konstanten der Klasse Entities
angegeben:
Statische Konstante | Entitätsart |
---|---|
Entities.NAMESPACE_METADATA_KIND |
__namespace__ |
Entities.KIND_METADATA_KIND |
__kind__ |
Entities.PROPERTY_METADATA_KIND |
__property__ |
Diese Arten stehen nicht in Konflikt mit anderen Arten derselben Namen, die möglicherweise bereits in Ihrer Anwendung vorhanden sind. Durch Abfragen dieser besonderen Arten können Sie Entitäten abrufen, die die gewünschten Metadaten enthalten.
Die von Metadatenabfragen zurückgegebenen Entitäten werden basierend auf dem aktuellen Status von Datastore dynamisch generiert. Sie können zwar lokale Entity
-Objekte der Arten __namespace__
, __kind__
oder __property__
erstellen, aber jeder Versuch, sie im Datenspeicher zu speichern, schlägt mit IllegalArgumentException
fehl.
Die einfachste Methode zum Ausgeben von Metadatenabfragen ist die Datastore API niedriger Stufe. Im folgenden Beispiel werden die Namen aller Namespaces in einer Anwendung ausgegeben:
Namespace-Abfragen
Wenn Ihre Anwendung die Namespaces API verwendet, können Sie mithilfe einer Namespace-Abfrage alle Namespaces ermitteln, die in den Entitäten der Anwendung verwendet werden. Auf diese Weise können Sie Aktivitäten, wie administrative Funktionen, über mehrere Namespaces hinweg ausführen.
Namespace-Abfragen geben Entitäten der speziellen Art __namespace__
zurück, deren Schlüsselname der Name eines Namespace ist. Eine Ausnahme bildet der Standard-Namespace, der mit dem leeren String ""
angegeben wird. Weil der leere String kein gültiger Schlüsselname ist, wird dieser Namespace stattdessen mit der numerischen ID 1
eingegeben. Bei Abfragen dieses Typs wird die Filterung nur für Bereiche über dem speziellen Pseudoattribut __key__
unterstützt, dessen Wert der Schlüssel der Entität ist. Die Ergebnisse können nach aufsteigendem (nicht jedoch nach absteigendem) __key__
-Wert sortiert werden. Weil __namespace__
-Entitäten keine Attribute haben, geben sowohl Abfragen, die ausschließlich schlüsselbasiert sind, als auch Abfragen, die nicht ausschließlich schlüsselbasiert sind, dieselben Informationen zurück.
Im folgenden Beispiel wird eine Liste der Namespaces einer Anwendung im Bereich zwischen den beiden angegebenen Namen start
und end
zurückgegeben:
Artabfragen
Artabfragen geben Entitäten der Art __kind__
zurück, deren Schlüsselname der Name einer Entitätsart ist. Abfragen dieses Typs sind implizit auf den aktuellen Namespace begrenzt und unterstützen die Filterung nur für Bereiche über dem Pseudoattribut __key__
. Die Ergebnisse können nach aufsteigendem (nicht jedoch nach absteigendem) __key__
-Wert sortiert werden. Weil __kind__
-Entitäten keine Attribute haben, geben sowohl Abfragen, die ausschließlich schlüsselbasiert sind, als auch Abfragen, die nicht ausschließlich schlüsselbasiert sind, dieselben Informationen zurück.
Im folgenden Beispiel werden alle Arten ausgegeben, deren Namen mit einem Kleinbuchstaben beginnen:
Attributabfragen
Attributabfragen geben Entitäten der Art __property__
zurück. Diese kennzeichnen die indexierten Attribute, die mit einer Entitätsart verknüpft sind. Die Entität zur Darstellung von Attribut P der Art K wird so erstellt:
- Der Entitätsschlüssel hat die Art
__property__
und den Schlüsselnamen P. - Der Schlüssel der übergeordneten Entität ist vom Typ
__kind__
und hat den Schlüsselnamen K.
Das Verhalten einer Attributabfrage hängt davon ab, ob es sich um eine ausschließlich schlüsselbasierte oder um eine nicht ausschließlich schlüsselbasierte (Attributsdarstellung) Abfrage handelt, wie in den folgenden Unterabschnitten beschrieben.
Attributabfragen: ausschließlich schlüsselbasiert
Ausschließlich schlüsselbasierte Attributabfragen geben für jedes indexierte Attribut einer angegebenen Entitätsart einen Schlüssel zurück. Nicht indexierte Attribute werden nicht einbezogen. Im folgenden Beispiel werden die Namen aller Entitätsarten einer Anwendung und die mit jeder Art verknüpften Attribute ausgegeben:
Abfragen dieser Art sind implizit auf den aktuellen Namespace beschränkt und unterstützen nur das Filtern für Bereiche oberhalb des Pseudoattributs __key__
, wobei die Schlüssel __kind__
- oder __property__
-Entitäten kennzeichnen. Die Ergebnisse können nach aufsteigendem (nicht jedoch nach absteigendem) __key__
-Wert sortiert werden. Die Filterung wird auf Art/Attribut-Paare angewendet, die zuerst nach Art und dann nach Attribut sortiert sind. Angenommen, Sie haben eine Entität mit den folgenden Attributen:
- Art
Account
mit Attributenbalance
company
- Art
Employee
mit Attributenname
ssn
- Art
Invoice
mit Attributendate
amount
- Art
Manager
mit Attributenname
title
- Art
Product
mit Attributendescription
price
Die Abfrage zum Zurückgeben der Attributdaten würde so aussehen:
Bei der oben aufgeführten Abfrage würde Folgendes zurückgegeben:
Employee: ssn
Invoice: date
Invoice: amount
Manager: name
Beachten Sie, dass die Ergebnisse weder das name
-Attribut der Art Employee
und das title
-Attribut der Art Manager
noch die Attribute der Arten Account
und Product
enthalten, weil sie außerhalb des für die Abfrage angegebenen Bereichs liegen.
Attributabfragen unterstützen auch die Ancestor-Filterung nach einem __kind__
- oder __property__
-Schlüssel, um die Abfrageergebnisse auf eine einzige Art oder ein einziges Attribut zu beschränken. Sie können diese Filterung beispielsweise verwenden, um die Attribute abzurufen, die einer bestimmten Entitätsart zugeordnet sind, wie im folgenden Beispiel gezeigt:
Attributabfragen: nicht ausschließlich schlüsselbasiert (Attributdarstellung)
Nicht ausschließlich schlüsselbasierte Attributabfragen, die als Attributdarstellungsabfragen bezeichnet werden, liefern zusätzliche Informationen zu den Darstellungen, die für jedes Art/Attribut-Paar verwendet werden. Nicht indexierte Attribute werden nicht einbezogen. Die Entität, die für das Attribut P der Art K zurückgegeben wird, hat denselben Schlüssel wie für eine entsprechende ausschließlich schlüsselbasierte Abfrage sowie ein weiteres property_representation
-Attribut, das die Darstellungen des Attributs zurückgibt. Der Wert dieses Attributs ist eine Instanz der Klassejava.util.Collection<String>
, das alle Darstellungen des Attributs von P in einer Entität der Art K enthält.
Beachten Sie, dass Darstellungen nicht mit Attributklassen identisch sind. Mehrere Attributklassen können derselben Darstellung zugeordnet sein. Beispiel: java.lang.String
und com.google.appengine.api.datastore.PhoneNumber
verwenden beide die STRING
-Darstellung.
Die folgende Tabelle enthält die Zuordnungen von Attributklassen zu ihren Darstellungen:
Attributklasse | Darstellung |
---|---|
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> |
Darstellung von T |
Im folgenden Beispiel werden alle Darstellungen einer angegebenen Property für eine bestimmte Entitätsart ermittelt: