집계 쿼리는 여러 색인이 생성된 항목의 데이터를 처리하여 단일 요약 값을 반환합니다. Datastore 모드의 Firestore는 다음 집계 쿼리를 지원합니다.
count()
sum()
avg()
집계 쿼리는 애플리케이션 코드를 단순화하고 처리를 위해 각 항목을 가져오는 것보다 비용이 적게 듭니다. 이 페이지를 읽고 집계 쿼리를 사용하는 방법에 대해 알아보세요.
count()
집계
count()
집계를 사용하여 지정된 쿼리와 일치하는 색인이 생성된 총 항목 수를 반환합니다. 예를 들어 이 count()
집계는 한 종류의 총 항목 수를 반환합니다.
자바
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은 다음과 같이 단순화된 count()
쿼리 형식을 지원합니다.
SELECT COUNT(*) AS total FROM tasks
이 예시에서는 total
의 선택적 별칭을 사용합니다.
이 단순화된 형식은 FROM
및 WHERE
절만 지원합니다. 자세한 내용은 GQL 참조를 확인하세요.
count()
집계에서는 쿼리의 모든 필터와 limit
절을 고려합니다. 예를 들어 다음 집계는 지정된 필터와 일치하는 항목 수를 반환합니다.
자바
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은 다음과 같이 단순화된 count()
쿼리 형식을 지원합니다.
SELECT COUNT(*) AS total FROM tasks WHERE is_done = false AND tag = 'house'
이 예시에서는 total
의 선택적 별칭을 사용합니다.
이 단순화된 형식은 FROM
및 WHERE
절만 지원합니다. 자세한 내용은 GQL 참조를 확인하세요.
이 예시에서는 특정 값까지 계수하는 방법을 보여줍니다. 예를 들어 이 기능을 사용하여 특정 숫자에서 개수를 중지하고 사용자에게 해당 숫자를 초과했음을 알릴 수 있습니다.
자바
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은 다음과 같이 단순화된 count_up_to()
쿼리 형식을 지원합니다.
SELECT COUNT_UP_TO(1000) AS total FROM tasks WHERE is_done = false AND tag = 'house'
이 예시에서는 total
의 선택적 별칭을 사용합니다.
이 단순화된 형식은 FROM
및 WHERE
절만 지원합니다. 자세한 내용은 GQL 참조를 확인하세요.
sum()
집계
sum()
집계를 사용하여 지정된 쿼리와 일치하는 숫자 값의 총 합계를 반환합니다. 예를 들어 다음 sum()
집계는 지정된 종류의 항목 중에서 지정된 속성의 숫자 값 합계를 반환합니다.
자바
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은 다음과 같이 단순화된 sum()
쿼리 형식을 지원합니다.
SELECT SUM(hours) AS total_hours FROM tasks
이 예시에서는 total_hours
의 선택적 별칭을 사용합니다.
이 단순화된 형식은 FROM
및 WHERE
절만 지원합니다. 자세한 내용은 GQL 참조를 확인하세요.
sum()
집계에서는 쿼리의 모든 필터와 limit
절을 고려합니다. 예를 들어 다음 집계는 지정된 필터와 일치하는 항목의 숫자 값이 있는 지정된 속성의 합계를 반환합니다.
자바
Python
이 쿼리에는 다음과 같은 색인이 필요합니다.
- 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은 다음과 같이 단순화된 sum()
쿼리 형식을 지원합니다.
SELECT SUM(hours) AS total_hours FROM tasks WHERE is_done = false AND tag = 'house'
이 예시에서는 total_hours
의 선택적 별칭을 사용합니다.
이 단순화된 형식은 FROM
및 WHERE
절만 지원합니다. 자세한 내용은 GQL 참조를 확인하세요.
avg()
집계
avg()
집계를 사용하여 지정된 쿼리와 일치하는 숫자 값의 평균을 반환합니다. 예를 들어 다음 avg()
집계는 쿼리와 일치하는 항목의 숫자 속성 값에서 지정된 속성의 산술 평균을 반환합니다.
자바
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은 다음과 같이 단순화된 avg()
쿼리 형식을 지원합니다.
SELECT AVG(hours) as avg_hours
이 예시에서는 avg_hours
의 선택적 별칭을 사용합니다.
이 단순화된 형식은 FROM
및 WHERE
절만 지원합니다. 자세한 내용은 GQL 참조를 확인하세요.
avg()
집계에서는 쿼리의 모든 필터와 limit
절을 고려합니다. 예를 들어 다음 집계는 쿼리 필터와 일치하는 항목의 숫자 속성 값에서 지정된 속성의 산술 평균을 반환합니다.
자바
Python
이 쿼리에는 다음과 같은 색인이 필요합니다.
- 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은 다음과 같이 단순화된 avg()
쿼리 형식을 지원합니다.
SELECT AVG(hours) as avg_hours FROM tasks WHERE is_done = false AND tag = 'house'
이 예시에서는 avg_hours
의 선택적 별칭을 사용합니다.
이 단순화된 형식은 FROM
및 WHERE
절만 지원합니다. 자세한 내용은 GQL 참조를 확인하세요.
쿼리에서 여러 집계 계산
단일 집계 파이프라인에서 여러 집계를 결합할 수 있습니다. 이렇게 하면 필요한 색인 읽기 수가 줄어들 수 있습니다. 쿼리에 여러 필드의 집계가 포함되는 경우 쿼리에 복합 색인이 필요하며, 각 집계 계산에는 각 집계에 사용되는 모든 필드를 포함하는 항목만 포함됩니다.
다음 예시는 단일 집계 쿼리에서 여러 집계를 수행합니다.
자바
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은 다음과 같이 단순화된 집계 쿼리 형식을 지원합니다.
SELECT SUM(hours) AS total_hours, COUNT(*) AS total_tasks FROM tasks WHERE is_done = false AND tag = 'house'
이 예시에서는 total_hours
및 total_tasks
의 선택적 별칭을 사용합니다.
이 단순화된 형식은 FROM
및 WHERE
절만 지원합니다. 자세한 내용은 GQL 참조를 확인하세요.
여러 집계가 있는 쿼리에는 각 집계의 모든 속성이 포함된 항목만 포함됩니다. 이로 인해 각 집계를 개별적으로 수행할 때와 결과가 달라질 수 있습니다.
동작 및 제한사항
집계 쿼리를 사용할 때 다음 동작과 제한사항에 주의하세요.
- 집계에 제공하는 쿼리는 쿼리 제한사항을 충족해야 합니다.
집계 쿼리가 60초 이내에 해결되지 않으면
DEADLINE_EXCEEDED
오류가 반환됩니다. 성능은 색인 구성과 데이터 세트의 크기에 따라 달라집니다.60초 기한 내에 작업을 완료할 수 없는 경우 가능한 해결 방법은 커서를 사용하여 여러 집계를 병합하는 것입니다.
집계 쿼리는 색인 항목에서 읽고 계산에 색인이 생성된 속성만 포함합니다.
쿼리에
OrderBy
절을 추가하면 정렬 속성이 있는 항목으로 집계가 제한됩니다.GQL에서 간소화된 양식은
ORDER BY
,LIMIT
또는OFFSET
절을 지원하지 않습니다.프로젝션 쿼리에서는 프로젝션의 속성에서만 데이터를 집계할 수 있습니다. 예를 들어 GQL 쿼리
SELECT a, b FROM k WHERE c = 1
은a
또는b
사이의 데이터만 집계할 수 있습니다.count()
집계는 배열 속성을 가진 항목의 중복을 제거하지 않습니다. 쿼리와 일치하는 각 배열 값은 개수에 하나를 추가합니다.sum()
및avg()
집계의 경우 숫자가 아닌 값은 무시됩니다.sum()
및avg()
집계는 정수 값, 부동 소수점 숫자 값, 타임스탬프만 고려합니다. 타임스탬프는sum()
,avg()
, 프로젝션의 마이크로초 정수 값으로 변환됩니다.단일 쿼리에서 여러 집계를 결합하는 경우
sum()
및avg()
는 숫자가 아닌 값을 무시하는 반면count()
에는 숫자가 아닌 값이 포함됩니다.서로 다른 속성에 있는 집계를 결합하면 해당 속성이 모두 포함된 항목만 계산에 포함됩니다. 이로 인해 각 집계를 개별적으로 수행할 때와 결과가 달라질 수 있습니다.
가격 책정
count()
, sum()
, avg()
집계 쿼리의 가격 책정은 작업 중에 스캔되는 색인 항목 수에 따라 달라집니다. 일치하는 최대 1,000개의 색인 항목에 대해 항목 1개 읽기 요금이 청구됩니다. 이후 색인 항목 수는 추가 읽기 단위 비용과 일치합니다. 모든 쿼리에 대해 최소 읽기 단위 1개의 비용이 발생합니다. 가격 책정 정보는 Datastore 모드의 Firestore 가격 책정을 참조하세요.
단일 쿼리에서 여러 집계를 결합하는 경우 쿼리는 각 집계에 동일한 색인을 사용하고 데이터에 대해 단일 스캔을 수행합니다. 이렇게 하면 각 집계를 개별적으로 실행하는 것보다 청구되는 색인 스캔 및 읽기 수가 줄어들 수 있습니다. 그러나 집계가 여러 개인 쿼리에는 이러한 속성을 모두 포함하는 항목만 포함됩니다. 이로 인해 각 집계를 개별적으로 수행할 때와 결과가 달라질 수 있습니다.
다음 단계
- 쿼리 알아보기
- Datastore 모드의 Firestore 권장사항 알아보기