Une requête d'agrégation traite les données de plusieurs entités indexées pour renvoyer une seule valeur de résumé. Firestore en mode Datastore accepte les éléments suivants : requêtes d'agrégation:
count()
sum()
avg()
Les requêtes d'agrégation simplifient le code de votre application et réduisent vos coûts plutôt que d'extraire chaque entité pour le traitement. Lisez cette page pour savoir comment utiliser dans les requêtes d'agrégation.
Agrégation de count()
Utiliser l'agrégation count()
pour renvoyer le nombre total d'entités indexées
qui correspondent à une requête donnée. Par exemple, cette agrégation count()
renvoie le nombre total d'entités d'un type.
Java
Python
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 )
GQL accepte une forme simplifiée de requêtes count()
:
SELECT COUNT(*) AS total FROM tasks
Cet exemple utilise un alias facultatif de total
.
Le formulaire simplifié n'accepte que FROM
et WHERE
.
. Pour en savoir plus, consultez la documentation de référence de GQL.
L'agrégation count()
prend en compte tous les filtres de la requête et tous les
limit
. Par exemple, l'agrégation suivante renvoie un nombre de
le nombre d'entités correspondant aux filtres donnés.
Java
Python
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')
GQL accepte une forme simplifiée de requêtes count()
:
SELECT COUNT(*) AS total FROM tasks WHERE is_done = false AND tag = 'house'
Cet exemple utilise un alias facultatif de total
.
Le formulaire simplifié n'accepte que FROM
et WHERE
.
. Pour en savoir plus, consultez la documentation de référence de GQL.
Cet exemple montre comment compter jusqu'à une certaine valeur. Vous pouvez l'utiliser pour, par exemple, arrêter de compter à un certain nombre et informer les utilisateurs qu'ils dépasse ce nombre.
Java
Python
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)
GQL accepte une forme simplifiée de requêtes count_up_to()
:
SELECT COUNT_UP_TO(1000) AS total FROM tasks WHERE is_done = false AND tag = 'house'
Cet exemple utilise un alias facultatif de total
.
Le formulaire simplifié n'est compatible qu'avec les clauses FROM
et WHERE
. Pour en savoir plus, consultez la documentation de référence de GQL.
Agrégation de sum()
Utilisez l'agrégation sum()
pour renvoyer la somme totale des valeurs numériques correspondantes
pour une requête donnée. Par exemple, le sum()
suivant
agrégation renvoie la somme totale des valeurs numériques de la propriété donnée à partir de
entités du genre donné:
Java
Python
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 )
GQL accepte une forme simplifiée de requêtes sum()
:
SELECT SUM(hours) AS total_hours FROM tasks
Cet exemple utilise un alias facultatif de total_hours
.
Le formulaire simplifié n'accepte que FROM
et WHERE
.
. Pour en savoir plus, consultez la documentation de référence de GQL.
L'agrégation sum()
prend en compte tous les filtres de la requête et tous les
limit
. Par exemple, l'agrégation suivante renvoie une somme de
la propriété spécifiée avec une valeur numérique dans les entités correspondant à la valeur
des filtres.
Java
Python
Cette requête nécessite un index tel que:
- kind: Task properties: - name: done - name: hours
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' )
GQL accepte une forme simplifiée de requêtes sum()
:
SELECT SUM(hours) AS total_hours FROM tasks WHERE is_done = false AND tag = 'house'
Cet exemple utilise un alias facultatif de total_hours
.
Le formulaire simplifié n'accepte que FROM
et WHERE
.
. Pour en savoir plus, consultez la documentation de référence de GQL.
Agrégation de avg()
Utilisez l'agrégation avg()
pour renvoyer la moyenne des valeurs numériques
correspondent à une requête donnée. Par exemple, le avg()
suivant
l'agrégation renvoie la valeur arithmétique
moyenne de la propriété spécifiée à partir des valeurs de propriété numériques des entités
qui correspondent à la requête:
Java
Python
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 )
GQL accepte une forme simplifiée de requêtes avg()
:
SELECT AVG(hours) as avg_hours
Cet exemple utilise un alias facultatif de avg_hours
.
Le formulaire simplifié n'accepte que FROM
et WHERE
.
. Pour en savoir plus, consultez la documentation de référence de GQL.
L'agrégation avg()
prend en compte tous les filtres de la requête et tous les
limit
. Par exemple, l'agrégation suivante renvoie la valeur arithmétique
moyenne de la propriété spécifiée à partir des valeurs de propriété numériques des entités
correspondent aux filtres de requête.
Java
Python
Cette requête nécessite un index tel que:
- kind: Task properties: - name: done - name: hours
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' )
GQL accepte une forme simplifiée de requêtes avg()
:
SELECT AVG(hours) as avg_hours FROM tasks WHERE is_done = false AND tag = 'house'
Cet exemple utilise un alias facultatif de avg_hours
.
Le formulaire simplifié n'accepte que FROM
et WHERE
.
. Pour en savoir plus, consultez la documentation de référence de GQL.
Calculer plusieurs agrégations dans une requête
Vous pouvez combiner plusieurs agrégations dans un même pipeline d'agrégation. Ce peut réduire le nombre de lectures d'index requises. Si la requête inclut des agrégations sur plusieurs champs, la requête nécessite un index composite, et chaque agrégation le calcul n'inclut que les entités qui contiennent tous les champs utilisés par chaque agrégation.
L'exemple suivant effectue plusieurs agrégations dans une seule requête d'agrégation:
Java
Python
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' )
GQL propose une forme simplifiée pour les requêtes d'agrégation :
SELECT SUM(hours) AS total_hours, COUNT(*) AS total_tasks FROM tasks WHERE is_done = false AND tag = 'house'
Cet exemple utilise les alias facultatifs de total_hours
et total_tasks
.
Le formulaire simplifié n'accepte que FROM
et WHERE
.
. Pour en savoir plus, consultez la documentation de référence de GQL.
Les requêtes comportant plusieurs agrégations n'incluent que les entités toutes les propriétés de chaque agrégation. Cela peut entraîner des en effectuant chaque agrégation séparément.
Comportement et limites
Lorsque vous travaillez avec des requêtes d'agrégation, tenez compte des comportements et des limites suivants :
- La requête que vous fournissez à l'agrégation doit répondre aux critères restrictions relatives aux requêtes.
Si une requête d'agrégation ne peut pas être résolue sous 60 secondes, une erreur
DEADLINE_EXCEEDED
est renvoyée. Les performances dépendent de la configuration de votre index et sur la taille de l'ensemble de données.Si l'opération ne peut pas être effectuée dans le délai de 60 secondes, une une solution de contournement possible consiste à utiliser des curseurs pour fusionner plusieurs agrégations.
Les requêtes d'agrégation lisent les entrées d'index et n'incluent que les requêtes indexées dans le calcul.
L'ajout d'une clause
OrderBy
à la requête limite l'agrégation au Entités dans lesquelles la propriété de tri existe.Dans GQL, la forme simplifiée n'accepte pas
ORDER BY
,LIMIT
ouOFFSET
.Dans une requête de projection, vous ne pouvez agréger des données qu'à partir des propriétés dans la projection. Par exemple, dans la requête GQL
SELECT a, b FROM k WHERE c = 1
, vous ne pouvez agréger des données qu'à partir dea
oub
.Une agrégation
count()
ne supprime pas les entités en double avec des propriétés de tableau. Chaque valeur du tableau correspondant à la requête ajoute une valeur au nombre.Pour les agrégations
sum()
etavg()
, les valeurs non numériques sont ignorées.sum()
et l'agrégationavg()
ne prennent en compte que les valeurs entières, les valeurs de nombres à virgule flottante et les codes temporels. Les codes temporels sont convertis en valeurs entières exprimées en microsecondes poursum()
,avg()
, et les projections.Lorsque vous combinez plusieurs agrégations dans une seule requête, notez que
sum()
etavg()
ignore les valeurs non numériques, tandis quecount()
inclut des valeurs non numériques.Si vous combinez des agrégations qui se trouvent sur des propriétés différentes, le calcul n'inclut que les entités qui contiennent toutes ces propriétés. Cela peut entraîner à des résultats différents en effectuant chaque agrégation séparément.
Tarifs
La tarification des requêtes d'agrégation count()
, sum()
et avg()
dépend de :
le nombre d'entrées d'index analysées au cours de l'opération. Un montant vous est facturé
lecture d'entité pour un maximum de 1 000 entrées d'index mises en correspondance. Entrées d'index suivantes
unités de lecture supplémentaires au coût correspondant. Un coût minimal d'une unité de lecture vous est facturé pour chaque requête. Pour les tarifs
consultez la page Tarifs de Firestore en mode Datastore.
Si vous combinez plusieurs agrégations dans une seule requête, celle-ci utilise le même pour chaque agrégation et effectue une seule analyse des données. Cela peut vous aider à réduire le nombre les analyses et les lectures sont facturées par rapport à l'exécution de chaque agrégation séparément. Toutefois, les requêtes comportant plusieurs agrégations n'incluent que les entités contenant toutes ces propriétés. Cela peut entraîner des résultats différents de en effectuant chaque agrégation séparément.
Étape suivante
- En savoir plus sur les requêtes.
- Découvrez les bonnes pratiques concernant Firestore en mode Datastore.