Uma consulta de agregação processa os dados de várias entidades indexadas para devolver um único valor de resumo. O Firestore no modo Datastore suporta as seguintes consultas de agregação:
count()
sum()
avg()
As consultas de agregação simplificam o código da aplicação e custam menos do que obter cada entidade para processamento. Leia esta página para saber como usar consultas de agregação.
count()
agregação
Use a agregação count()
para devolver o número total de entidades indexadas que correspondem a uma determinada consulta. Por exemplo, esta agregação count()
devolve o número total de entidades num tipo.
Java
Python
Ir
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 )
O GQL suporta uma forma simplificada de consultas count()
:
SELECT COUNT(*) AS total FROM tasks
Este exemplo usa um alias opcional de total
.
O formulário simplificado suporta apenas as cláusulas FROM
e WHERE
. Consulte a referência da GQL para mais informações.
A agregação count()
tem em conta todos os filtros na consulta e todas as cláusulas limit
. Por exemplo, a seguinte agregação devolve uma contagem do número de entidades que correspondem aos filtros fornecidos.
Java
Python
Ir
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')
O GQL suporta uma forma simplificada de consultas count()
:
SELECT COUNT(*) AS total FROM tasks WHERE is_done = false AND tag = 'house'
Este exemplo usa um alias opcional de total
.
O formulário simplificado suporta apenas cláusulas FROM
e WHERE
. Consulte a referência da GQL para mais informações.
Este exemplo mostra como contar até um determinado valor. Pode usar esta opção para, por exemplo, parar a contagem num determinado número e informar os utilizadores de que excederam esse número.
Java
Python
Ir
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)
O GQL suporta uma forma simplificada de consultas count_up_to()
:
SELECT COUNT_UP_TO(1000) AS total FROM tasks WHERE is_done = false AND tag = 'house'
Este exemplo usa um alias opcional de total
.
O formulário simplificado suporta apenas cláusulas FROM
e WHERE
. Consulte a referência da GQL para mais informações.
sum()
agregação
Use a agregação sum()
para devolver a soma total dos valores numéricos que correspondem a uma determinada consulta. Por exemplo, a seguinte agregação devolve a soma total dos valores numéricos da propriedade especificada de entidades do tipo especificado:sum()
Java
Python
Ir
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 )
O GQL suporta uma forma simplificada de consultas sum()
:
SELECT SUM(hours) AS total_hours FROM tasks
Este exemplo usa um alias opcional de total_hours
.
O formulário simplificado suporta apenas as cláusulas FROM
e WHERE
. Consulte a referência da GQL para mais informações.
A agregação sum()
tem em conta todos os filtros na consulta e todas as cláusulas limit
. Por exemplo, a seguinte agregação devolve uma soma da propriedade especificada com um valor numérico em entidades que correspondem aos filtros fornecidos.
Java
Python
Esta consulta requer um índice, como:
- kind: Task properties: - name: done - name: hours
Ir
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' )
O GQL suporta uma forma simplificada de consultas sum()
:
SELECT SUM(hours) AS total_hours FROM tasks WHERE is_done = false AND tag = 'house'
Este exemplo usa um alias opcional de total_hours
.
O formulário simplificado suporta apenas as cláusulas FROM
e WHERE
. Consulte a referência da GQL para mais informações.
avg()
agregação
Use a agregação avg()
para devolver a média dos valores numéricos que correspondem a uma determinada consulta. Por exemplo, a seguinte agregação devolve a média aritmética da propriedade especificada a partir dos valores de propriedades numéricas de entidades que correspondem à consulta:avg()
Java
Python
Ir
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 )
O GQL suporta uma forma simplificada de consultas avg()
:
SELECT AVG(hours) as avg_hours
Este exemplo usa um alias opcional de avg_hours
.
O formulário simplificado suporta apenas as cláusulas FROM
e WHERE
. Consulte a referência da GQL para mais informações.
A agregação avg()
tem em conta todos os filtros na consulta e todas as cláusulas limit
. Por exemplo, a seguinte agregação devolve a média aritmética da propriedade especificada a partir dos valores de propriedades numéricas de entidades que correspondem aos filtros de consulta.
Java
Python
Esta consulta requer um índice, como:
- kind: Task properties: - name: done - name: hours
Ir
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' )
O GQL suporta uma forma simplificada de consultas avg()
:
SELECT AVG(hours) as avg_hours FROM tasks WHERE is_done = false AND tag = 'house'
Este exemplo usa um alias opcional de avg_hours
.
O formulário simplificado suporta apenas as cláusulas FROM
e WHERE
. Consulte a referência da GQL para mais informações.
Calcule várias agregações numa consulta
Pode combinar várias agregações num único pipeline de agregação. Isto pode reduzir o número de leituras de índice necessárias. Se a consulta incluir agregações em vários campos, a consulta requer um índice composto e cada cálculo de agregação inclui apenas as entidades que contêm todos os campos usados por cada agregação.
O exemplo seguinte executa várias agregações numa única consulta de agregação:
Java
Python
Ir
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' )
O GQL suporta um formulário simplificado para consultas de agregação:
SELECT SUM(hours) AS total_hours, COUNT(*) AS total_tasks FROM tasks WHERE is_done = false AND tag = 'house'
Este exemplo usa os alias opcionais de total_hours
e total_tasks
.
O formulário simplificado suporta apenas as cláusulas FROM
e WHERE
. Consulte a referência da GQL para mais informações.
As consultas com várias agregações incluem apenas as entidades que contêm todas as propriedades em cada agregação. Isto pode levar a resultados diferentes da execução de cada agregação em separado.
Comportamento e limitações
Ao trabalhar com consultas de agregação, tenha em atenção o seguinte comportamento e limitações:
- A consulta que fornece à agregação tem de cumprir as restrições nas consultas.
Se uma consulta de agregação não puder ser resolvida no prazo de 60 segundos, devolve um erro
DEADLINE_EXCEEDED
. O desempenho depende da configuração do índice e do tamanho do conjunto de dados.Se a operação não puder ser concluída no prazo de 60 segundos, uma possível solução alternativa é usar cursores para unir várias agregações.
As consultas de agregação leem as entradas do índice e incluem apenas propriedades indexadas no cálculo.
Adicionar uma cláusula
OrderBy
à consulta limita a agregação às entidades onde a propriedade de ordenação existe.No GQL, a forma simplificada não suporta as cláusulas
ORDER BY
,LIMIT
nemOFFSET
.Numa consulta de projeção, só pode agregar dados das propriedades na projeção. Por exemplo, na consulta GQL
SELECT a, b FROM k WHERE c = 1
, pode agregar dados apenas dea
oub
.Uma agregação
count()
não remove duplicados de entidades com propriedades de matriz. Cada valor da matriz que corresponda à consulta adiciona um à contagem.Para as agregações
sum()
eavg()
, os valores não numéricos são ignorados. A agregaçãosum()
eavg()
tem em conta apenas valores inteiros, valores de números de vírgula flutuante e datas/horas. As indicações de tempo são convertidas em valores inteiros de microssegundos parasum()
,avg()
e projeções.Quando combinar várias agregações numa única consulta, tenha em atenção que
sum()
eavg()
ignoram os valores não numéricos, enquantocount()
inclui valores não numéricos.Se combinar agregações que se encontram em propriedades diferentes, o cálculo inclui apenas as entidades que contêm todas essas propriedades. Isto pode levar a resultados diferentes da execução de cada agregação separadamente.
Preços
O preço das consultas de agregação count()
, sum()
e avg()
depende do número de entradas de índice analisadas durante a operação. É-lhe faturada uma leitura de entidade para até 1000 entradas de índice correspondentes. As entradas de índice subsequentes
com correspondência custam unidades de leitura adicionais. Existe um custo mínimo de uma unidade de leitura para cada consulta. Para ver informações
sobre preços, consulte a secção Preços do Firestore no modo Datastore.
Se combinar várias agregações numa única consulta, a consulta usa o mesmo índice para cada agregação e executa uma única análise dos dados. Isto pode ajudar a reduzir o número de leituras e verificações de índice faturadas em comparação com a execução de cada agregação separadamente. No entanto, as consultas com várias agregações incluem apenas as entidades que contêm todas essas propriedades. Isto pode levar a resultados diferentes dos da execução de cada agregação separadamente.
O que se segue?
- Saiba mais sobre as consultas.
- Saiba mais acerca das práticas recomendadas para o Firestore no modo Datastore.