Die meisten Datastore-Abfragen geben ganze Entitäten als Ergebnisse zurück, häufig benötigt eine Anwendung jedoch nur einige wenige Attribute einer Entität. Mit Projektionsabfragen können Sie Datastore nur auf die Attribute einer Entität abfragen, die Sie wirklich benötigen, und zwar mit einer geringeren Latenz und niedrigeren Kosten als beim Abrufen der ganzen Entität.
Projektionsabfragen ähneln SQL-Abfragen der folgenden Form:
SELECT name, email, phone FROM CUSTOMER
Sie können alle Filter- und Sortierfunktionen, die für Standardentitätsabfragen verfügbar sind, innerhalb der unten beschriebenen Einschränkungen verwenden. Die Abfrage gibt gekürzte Ergebnisse zurück, wobei nur die angegebenen Attribute (im Beispiel name
, email
und phone
) mit Werten gefüllt sind. Alle anderen Attribute enthalten keine Daten.
Projektionsabfragen in Go 1.11 verwenden
Geben Sie beim Vorbereiten einer Query
eine Projektion mithilfe der Methode Project
an:
Sie verarbeiten die Ergebnisse dieser Abfragen genauso wie bei einer Standardentitätsabfrage, z. B., durch Iteration über die Ergebnisse.
Im folgenden Beispiel werden die Attribute Title
, ReadPath
und DateWritten
aller EventLog
-Einträge abgefragt und in aufsteigender Reihenfolge nach DateWritten
sortiert. Der Wert jedes Attributs wird ins Anwendungslog geschrieben:
Gruppierung(experimentell)
Projektionsabfragen können mit der Methode Distinct
dafür sorgen, dass wirklich nur einmal vorkommende Ergebnisse in einer Ergebnismenge zurückgegeben werden. So wird nur das erste Ergebnis für Entitäten zurückgegeben, die für die projizierten Attribute dieselben Werte haben.
Einschränkungen bei Projektionen
Projektionsabfragen unterliegen folgenden Einschränkungen:
Nur indexierte Attribute können projiziert werden.
Projektion wird für Properties, die nicht explizit oder implizit indexiert sind, nicht unterstützt. Strings, die länger als 1.500 Byte sind, und Bytearrays, die mehr als 1.500 Elemente enthalten, werden nicht indexiert.
Ein Attribut kann nicht mehr als einmal projiziert werden.
Attribute, die in einem Gleichheitsfilter (
=
) referenziert werden, können nicht projiziert werden.Beispiel:
SELECT A FROM kind WHERE B = 1
ist gültig (projiziertes Attribut nicht im Gleichheitsfilter verwendet), wie auch
SELECT A FROM kind WHERE A > 1
(kein Gleichheitsfilter), aber
SELECT A FROM kind WHERE A = 1
(projizierte Property in Gleichheitsfilter verwendet) ist nicht gültig.
Von einer Projektionsabfrage zurückgegebene Ergebnisse sollten nicht wieder in Datastore gespeichert werden.
Da die Abfrage Ergebnisse zurückgibt, die nur teilweise ausgefüllt sind, sollten sie nicht zurück in Datastore geschrieben werden.
Projektionen und mehrwertige Attribute
Bei der Projektion eines Attributs mit mehreren Werten werden nicht alle Werte dieses Attributs ausgefüllt. Stattdessen wird eine separate Entität für jede nur einmal vorkommende Kombination von projizierten Werten zurückgegeben, die mit der Abfrage übereinstimmen. Angenommen, Sie haben eine Entität vom Typ Foo
mit den beiden mehrwertigen Attributen A
und B
:
dann gibt die Projektionsabfrage
vier Entitäten mit den folgenden Wertekombinationen zurück:
A
= 1
, B
= 'x'
A
= 1
, B
= 'y'
A
= 2
, B
= 'x'
A
= 2
, B
= 'y'
Bei einer Entität mit einem mehrwertigen Attribut ohne Werte werden keine Einträge in den Index aufgenommen und keine Ergebnisse für diese Entität von einer Projektionsabfrage mit diesem Attribut zurückgegeben.
Indexe für Projektionen
Bei Projektionsabfragen müssen alle in der Projektion angegebenen Attribute in einem Datastore-Index enthalten sein. Der App Engine-Entwicklungsserver generiert automatisch die benötigten Indexe in der Indexkonfigurationsdatei index.yaml
, die mit Ihrer Anwendung hochgeladen wird.
Die Anzahl der benötigten Indexe können Sie beispielsweise durch konstantes Projizieren derselben Attribute reduzieren, auch wenn nicht immer alle benötigt werden. Diese Abfragen benötigen beispielsweise zwei getrennte Indexe:
SELECT A, B FROM Kind
SELECT A, B, C FROM Kind
Wenn Sie immer die Attribute A
, B
und C
projizieren, auch wenn C
nicht benötigt wird, ist nur ein Index erforderlich.
Wenn Sie eine bestehende Abfrage in eine Projektionsabfrage umwandeln, müssen Sie gegebenenfalls einen neuen Index erstellen, wenn die Attribute für die Projektion nicht bereits in einem anderen Teil der Abfrage enthalten sind. Angenommen, Sie haben diese bestehende Abfrage:
SELECT * FROM Kind WHERE A > 1 ORDER BY A, B
Sie benötigt diesen Index:
Index(Kind, A, B)
Wenn diese in eine dieser Projektionsabfragen konvertiert wird:
SELECT C FROM Kind WHERE A > 1 ORDER BY A, B
SELECT A, B, C FROM Kind WHERE A > 1 ORDER BY A, B
wird ein neues Attribut (C
) eingeführt. Dies erfordert die Erstellung eines neuen Indexes Index(Kind,
A,
B,
C)
. Die Projektionsabfrage
SELECT A, B FROM Kind WHERE A > 1 ORDER BY A, B
ändert den erforderlichen Index nicht, da die projizierten Attribute A
und B
bereits in der vorhandenen Abfrage enthalten sind.