Bei einer Aggregationsabfrage werden die Daten aus mehreren indexierten Entitäten verarbeitet, um einen einzelnen Zusammenfassungswert zurückzugeben. Firestore im Datastore-Modus unterstützt die folgenden Aggregationsabfragen:
count()
sum()
avg()
Aggregationsabfragen vereinfachen Ihren Anwendungscode und kosten weniger als das Abrufen jeder Entität zur Verarbeitung. Auf dieser Seite erfahren Sie, wie Sie Aggregationsabfragen verwenden.
Aggregation von count()
Mit der Aggregation count()
wird die Gesamtzahl der indexierten Entitäten zurückgegeben, die einer bestimmten Abfrage entsprechen. Die Aggregation count()
gibt beispielsweise die Gesamtzahl der Entitäten in einer Art zurück.
Java
Python
Einfach loslegen (Go)
aggregationCountQuery := datastore.NewQuery("Task"). NewAggregationQuery(). WithCount("total_tasks") countResults, err := client.RunAggregationQuery(ctx, aggregationCountQuery) count := countResults["total_tasks"] countValue := count.(*datastorepb.Value) fmt.Printf("Number of results from query: %d\n", countValue.GetIntegerValue())
GQL
AGGREGATE COUNT(*) AS total OVER ( SELECT * AS total FROM tasks )
Gboard unterstützt eine vereinfachte Form von count()
-Abfragen:
SELECT COUNT(*) AS total FROM tasks
In diesem Beispiel wird der optionale Alias total
verwendet.
Die vereinfachte Form unterstützt nur die Klauseln FROM
und WHERE
. Weitere Informationen finden Sie in der GQL-Referenz.
Die Aggregation count()
berücksichtigt alle Filter in der Abfrage und alle limit
-Klauseln. Die folgende Aggregation gibt beispielsweise die Anzahl der Entitäten zurück, die den angegebenen Filtern entsprechen.
Java
Python
Einfach loslegen (Go)
aggregationCountQuery := datastore.NewQuery("Task"). FilterField("done", "=", true). NewAggregationQuery(). WithCount("total_tasks_done") countResults, err := client.RunAggregationQuery(ctx, aggregationCountQuery) count := countResults["total_tasks_done"] countValue := count.(*datastorepb.Value) fmt.Printf("Number of results from query: %d\n", countValue.GetIntegerValue())
GQL
AGGREGATE COUNT(*) OVER ( SELECT * FROM tasks WHERE is_done = false AND tag = 'house')
Gboard unterstützt eine vereinfachte Form von count()
-Abfragen:
SELECT COUNT(*) AS total FROM tasks WHERE is_done = false AND tag = 'house'
In diesem Beispiel wird der optionale Alias total
verwendet.
Die vereinfachte Form unterstützt nur die Klauseln FROM
und WHERE
. Weitere Informationen finden Sie in der GQL-Referenz.
Dieses Beispiel zeigt, wie bis zu einem bestimmten Wert gezählt wird. Damit können Sie z. B. die Zählung bei einer bestimmten Anzahl beenden und Nutzer darüber informieren, dass sie diese Zahl überschritten haben.
Java
Python
Einfach loslegen (Go)
aggregationCountQuery := datastore.NewQuery("Task"). Limit(2). NewAggregationQuery(). WithCount("at_least") countResults, err := client.RunAggregationQuery(ctx, aggregationCountQuery) count := countResults["at_least"] countValue := count.(*datastorepb.Value) fmt.Printf("We have at least %d tasks\n", countValue.GetIntegerValue())
GQL
AGGREGATE COUNT_UP_TO(1000) OVER ( SELECT * FROM tasks WHERE is_done = false)
Gboard unterstützt eine vereinfachte Form von count_up_to()
-Abfragen:
SELECT COUNT_UP_TO(1000) AS total FROM tasks WHERE is_done = false AND tag = 'house'
In diesem Beispiel wird der optionale Alias total
verwendet.
Die vereinfachte Form unterstützt nur die Klauseln FROM
und WHERE
. Weitere Informationen finden Sie in der GQL-Referenz.
Aggregation von sum()
Mit der Aggregation sum()
können Sie die Gesamtsumme der numerischen Werte zurückgeben, die mit einer bestimmten Abfrage übereinstimmen. Die folgende sum()
-Aggregation gibt beispielsweise die Gesamtsumme der numerischen Werte des angegebenen Attributs aus Entitäten der angegebenen Art zurück:
Java
Python
Einfach loslegen (Go)
aggregationSumQuery := datastore.NewQuery("Task"). NewAggregationQuery(). WithSum("hours", "total_hours") sumResults, err := client.RunAggregationQuery(ctx, aggregationSumQuery) sum := sumResults["total_hours"] sumValue := sum.(*datastorepb.Value) fmt.Printf("Sum of results from query: %d\n", sumValue.GetIntegerValue())
GQL
AGGREGATE SUM(hours) AS total_hours OVER ( SELECT * FROM tasks )
Gboard unterstützt eine vereinfachte Form von sum()
-Abfragen:
SELECT SUM(hours) AS total_hours FROM tasks
In diesem Beispiel wird der optionale Alias total_hours
verwendet.
Die vereinfachte Form unterstützt nur die Klauseln FROM
und WHERE
. Weitere Informationen finden Sie in der GQL-Referenz.
Die Aggregation sum()
berücksichtigt alle Filter in der Abfrage und alle limit
-Klauseln. Die folgende Aggregation gibt beispielsweise eine Summe der angegebenen Property mit einem numerischen Wert in Entitäten zurück, die den angegebenen Filtern entsprechen.
Java
Python
Für diese Abfrage ist ein Index wie der folgende erforderlich:
- kind: Task properties: - name: done - name: hours
Einfach loslegen (Go)
aggregationSumQuery := datastore.NewQuery("Task"). FilterField("done", "=", false). FilterField("tag", "=", "house"). NewAggregationQuery(). WithSum("hours", "total_hours") sumResults, err := client.RunAggregationQuery(ctx, aggregationSumQuery) sum := sumResults["total_hours"] sumValue := sum.(*datastorepb.Value) fmt.Printf("Sum of results from query: %d\n", sumValue.GetIntegerValue())
GQL
AGGREGATE SUM(hours) AS total_hours OVER ( SELECT * FROM tasks WHERE is_done = false AND tag = 'house' )
Gboard unterstützt eine vereinfachte Form von sum()
-Abfragen:
SELECT SUM(hours) AS total_hours FROM tasks WHERE is_done = false AND tag = 'house'
In diesem Beispiel wird der optionale Alias total_hours
verwendet.
Die vereinfachte Form unterstützt nur die Klauseln FROM
und WHERE
. Weitere Informationen finden Sie in der GQL-Referenz.
Aggregation von avg()
Mit der Aggregation avg()
können Sie den Durchschnitt der numerischen Werte zurückgeben, die einer bestimmten Abfrage entsprechen. Die folgende avg()
-Aggregation gibt beispielsweise den arithmetischen Mittelwert der angegebenen Eigenschaft aus den numerischen Attributwerten der Entitäten zurück, die der Abfrage entsprechen:
Java
Python
Einfach loslegen (Go)
aggregationAvgQuery := datastore.NewQuery("Task"). NewAggregationQuery(). WithAvg("hours", "avg_hours") avgResults, err := client.RunAggregationQuery(ctx, aggregationAvgQuery) avg := avgResults["avg_hours"] avgValue := avg.(*datastorepb.Value) fmt.Printf("average hours: %f\n", avgValue.GetDoubleValue())
GQL
AGGREGATE AVG(hours) as avg_hours OVER ( SELECT * FROM tasks )
Gboard unterstützt eine vereinfachte Form von avg()
-Abfragen:
SELECT AVG(hours) as avg_hours
In diesem Beispiel wird der optionale Alias avg_hours
verwendet.
Die vereinfachte Form unterstützt nur die Klauseln FROM
und WHERE
. Weitere Informationen finden Sie in der GQL-Referenz.
Die Aggregation avg()
berücksichtigt alle Filter in der Abfrage und alle limit
-Klauseln. Bei der folgenden Aggregation wird beispielsweise der arithmetische Mittelwert der angegebenen Property aus den numerischen Attributwerten von Entitäten zurückgegeben, die den Abfragefiltern entsprechen.
Java
Python
Für diese Abfrage ist ein Index wie der folgende erforderlich:
- kind: Task properties: - name: done - name: hours
Einfach loslegen (Go)
aggregationAvgQuery := datastore.NewQuery("Task"). FilterField("done", "=", false). FilterField("tag", "=", "house"). NewAggregationQuery(). WithAvg("hours", "avg_hours") avgResults, err := client.RunAggregationQuery(ctx, aggregationAvgQuery) avg := avgResults["avg_hours"] avgValue := avg.(*datastorepb.Value) fmt.Printf("average hours: %f\n", avgValue.GetDoubleValue())
GQL
AGGREGATE AVG(hours) as avg_hours OVER ( SELECT * FROM tasks WHERE is_done = false AND tag = 'house' )
Gboard unterstützt eine vereinfachte Form von avg()
-Abfragen:
SELECT AVG(hours) as avg_hours FROM tasks WHERE is_done = false AND tag = 'house'
In diesem Beispiel wird der optionale Alias avg_hours
verwendet.
Die vereinfachte Form unterstützt nur die Klauseln FROM
und WHERE
. Weitere Informationen finden Sie in der GQL-Referenz.
Mehrere Aggregationen in einer Abfrage berechnen
Sie können mehrere Aggregationen in einer einzigen Aggregationspipeline kombinieren. Dies kann die Anzahl der erforderlichen Indexlesevorgänge reduzieren. Wenn die Abfrage Aggregationen für mehrere Felder enthält, erfordert sie einen zusammengesetzten Index und jede Aggregationsberechnung umfasst nur die Entitäten, die alle von der jeweiligen Aggregation verwendeten Felder enthalten.
Im folgenden Beispiel werden mehrere Aggregationen in einer einzigen Aggregationsabfrage ausgeführt:
Java
Python
Einfach loslegen (Go)
aggregationQuery := datastore.NewQuery("Task"). NewAggregationQuery(). WithCount("total_tasks"). WithSum("hours", "total_hours"). WithAvg("hours", "avg_hours") Results, err := client.RunAggregationQuery(ctx, aggregationQuery) fmt.Printf("Number of results from query: %d\n", Results["total_tasks"].(*datastorepb.Value).GetIntegerValue()) fmt.Printf("Sum of results from query: %d\n", Results["total_hours"].(*datastorepb.Value).GetIntegerValue()) fmt.Printf("Avg of results from query: %f\n", Results["avg_hours"].(*datastorepb.Value).GetDoubleValue())
GQL
AGGREGATE SUM(hours) AS total_hours, COUNT(*) AS total_tasks OVER ( SELECT * FROM tasks WHERE is_done = false AND tag = 'house' )
Gboard unterstützt eine vereinfachte Form für Aggregationsabfragen:
SELECT SUM(hours) AS total_hours, COUNT(*) AS total_tasks FROM tasks WHERE is_done = false AND tag = 'house'
In diesem Beispiel werden die optionalen Aliasse total_hours
und total_tasks
verwendet.
Die vereinfachte Form unterstützt nur die Klauseln FROM
und WHERE
. Weitere Informationen finden Sie in der GQL-Referenz.
Abfragen mit Mehrfachaggregation beinhalten nur die Entitäten, die in jeder Aggregation alle Attribute enthalten. Dies kann zu anderen Ergebnissen führen, wenn jede Aggregation separat ausgeführt wird.
Verhalten und Einschränkungen
Beachten Sie beim Arbeiten mit Aggregationsabfragen die folgenden Verhaltensweisen und Einschränkungen:
- Die Abfrage, die Sie für die Aggregation bereitstellen, muss die Einschränkungen für Abfragen erfüllen.
Wenn eine Aggregationsabfrage nicht innerhalb von 60 Sekunden aufgelöst werden kann, wird der Fehler
DEADLINE_EXCEEDED
zurückgegeben. Die Leistung hängt von Ihrer Indexkonfiguration und der Größe des Datasets ab.Wenn der Vorgang nicht innerhalb der 60 Sekunden abgeschlossen werden kann, können Sie das Problem umgehen, indem Sie mehrere Aggregationen mit cursors zusammenführen.
Aggregationsabfragen lesen aus Indexeinträgen und beziehen nur indexierte Attribute in die Berechnung ein.
Wenn Sie der Abfrage eine
OrderBy
-Klausel hinzufügen, wird die Aggregation auf die Entitäten begrenzt, in denen die Sortiereigenschaft vorhanden ist.In Gboard unterstützt die vereinfachte Form keine
ORDER BY
-,LIMIT
- oderOFFSET
-Klauseln.In einer Projektionsabfrage können Sie Daten nur aus den Attributen in der Projektion aggregieren. Beispielsweise können Sie in der {9/}-Abfrage
SELECT a, b FROM k WHERE c = 1
nur Daten ausa
oderb
aggregieren.Bei einer
count()
-Aggregation werden Entitäten mit Array-Attributen nicht dedupliziert. Jeder Arraywert, der mit der Abfrage übereinstimmt, zählt zu der Anzahl um 1.Bei Aggregationen
sum()
undavg()
werden nicht numerische Werte ignoriert. Bei den Aggregationensum()
undavg()
werden nur Ganzzahlwerte, Gleitkommazahlenwerte und Zeitstempel berücksichtigt. Zeitstempel werden fürsum()
,avg()
und Projektionen in ganzzahlige Mikrosekundenwerte umgewandelt.Wenn Sie mehrere Aggregationen in einer einzigen Abfrage kombinieren, ignorieren
sum()
undavg()
nicht numerische Werte, währendcount()
nicht numerische Werte enthält.Wenn Sie Aggregationen kombinieren, die sich auf verschiedenen Attributen befinden, umfasst die Berechnung nur die Entitäten, die alle diese Attribute enthalten. Dies kann zu anderen Ergebnissen führen, wenn jede Aggregation separat ausgeführt wird.
Preise
Die Preise für die Aggregationsabfragen count()
, sum()
und avg()
hängen von der Anzahl der während des Vorgangs gescannten Indexeinträge ab. Ihnen wird ein Entitätslesevorgang für bis zu 1.000 übereinstimmende Indexeinträge in Rechnung gestellt. Nachfolgende Indexeinträge entsprachen den Kosten zusätzlicher Leseeinheiten. Pro Abfrage gelten Mindestkosten von einer Leseeinheit. Preisinformationen finden Sie unter Preise für Firestore im Datastore-Modus.
Wenn Sie mehrere Aggregationen in einer einzigen Abfrage kombinieren, verwendet die Abfrage für jede Aggregation denselben Index und führt einen einzelnen Scan für die Daten durch. Dies kann dazu beitragen, die Anzahl der in Rechnung gestellten Indexscans und Lesevorgänge im Vergleich zur separaten Aggregation zu reduzieren. Abfragen mit mehreren Aggregationen umfassen jedoch nur die Entitäten, die alle diese Attribute enthalten. Dies kann zu anderen Ergebnissen führen, wenn jede Aggregation separat ausgeführt wird.
Nächste Schritte
- Weitere Informationen zu Abfragen
- Best Practices für Firestore im Datastore-Modus