Kueri agregasi memproses data dari beberapa entity yang diindeks untuk menampilkan satu nilai ringkasan. Firestore dalam mode Datastore mendukung kueri agregasi berikut:
count()
sum()
avg()
Kueri agregasi menyederhanakan kode aplikasi Anda dan biayanya lebih rendah daripada mengambil setiap entitas untuk diproses. Baca halaman ini untuk mempelajari cara menggunakan kueri agregasi.
Agregasi count()
Gunakan agregasi count()
untuk menampilkan jumlah total entitas yang diindeks
yang cocok dengan kueri tertentu. Misalnya, agregasi count()
ini menampilkan jumlah total entity dalam jenis.
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 mendukung bentuk sederhana kueri count()
:
SELECT COUNT(*) AS total FROM tasks
Contoh ini menggunakan alias opsional total
.
Bentuk yang disederhanakan hanya mendukung klausa FROM
dan WHERE
. Lihat referensi GQL untuk informasi selengkapnya.
Agregasi count()
memperhitungkan semua filter pada kueri dan klausa limit
. Misalnya, agregasi berikut menampilkan jumlah
entitas yang cocok dengan filter yang diberikan.
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 mendukung bentuk sederhana kueri count()
:
SELECT COUNT(*) AS total FROM tasks WHERE is_done = false AND tag = 'house'
Contoh ini menggunakan alias opsional total
.
Bentuk yang disederhanakan hanya mendukung klausa
FROM
dan WHERE
. Lihat referensi GQL untuk informasi selengkapnya.
Contoh ini menunjukkan cara menghitung hingga nilai tertentu. Anda dapat menggunakannya untuk, misalnya, berhenti menghitung pada jumlah tertentu dan memberi tahu pengguna bahwa mereka melampaui jumlah tersebut.
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 mendukung bentuk sederhana kueri count_up_to()
:
SELECT COUNT_UP_TO(1000) AS total FROM tasks WHERE is_done = false AND tag = 'house'
Contoh ini menggunakan alias opsional total
.
Bentuk yang disederhanakan hanya mendukung klausa
FROM
dan WHERE
. Lihat referensi GQL untuk informasi selengkapnya.
Agregasi sum()
Gunakan agregasi sum()
untuk menampilkan jumlah total nilai numerik yang cocok dengan kueri tertentu. Misalnya, agregasi sum()
berikut menampilkan jumlah total nilai numerik properti tertentu dari
entity jenis tertentu:
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 mendukung bentuk sederhana kueri sum()
:
SELECT SUM(hours) AS total_hours FROM tasks
Contoh ini menggunakan alias opsional total_hours
.
Bentuk yang disederhanakan hanya mendukung klausa FROM
dan WHERE
. Lihat referensi GQL untuk informasi selengkapnya.
Agregasi sum()
memperhitungkan semua filter pada kueri dan klausa limit
. Misalnya, agregasi berikut menampilkan jumlah
properti yang ditentukan dengan nilai numerik dalam entity yang cocok dengan filter
tertentu.
Java
Python
Kueri ini memerlukan indeks seperti:
- 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 mendukung bentuk sederhana kueri sum()
:
SELECT SUM(hours) AS total_hours FROM tasks WHERE is_done = false AND tag = 'house'
Contoh ini menggunakan alias opsional total_hours
.
Bentuk yang disederhanakan hanya mendukung klausa FROM
dan WHERE
. Lihat referensi GQL untuk informasi selengkapnya.
Agregasi avg()
Gunakan agregasi avg()
untuk menampilkan rata-rata nilai numerik yang
cocok dengan kueri tertentu. Misalnya, agregasi avg()
berikut
menampilkan rata-rata
aritmetika properti yang ditentukan dari nilai properti numerik entity
yang cocok dengan kueri:
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 mendukung bentuk sederhana kueri avg()
:
SELECT AVG(hours) as avg_hours
Contoh ini menggunakan alias opsional avg_hours
.
Bentuk yang disederhanakan hanya mendukung klausa FROM
dan WHERE
. Lihat referensi GQL untuk informasi selengkapnya.
Agregasi avg()
memperhitungkan semua filter pada kueri dan klausa limit
. Misalnya, agregasi berikut menampilkan rata-rata hitung hitung dari properti yang ditentukan dari nilai properti numerik entity yang cocok dengan filter kueri.
Java
Python
Kueri ini memerlukan indeks seperti:
- 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 mendukung bentuk sederhana kueri avg()
:
SELECT AVG(hours) as avg_hours FROM tasks WHERE is_done = false AND tag = 'house'
Contoh ini menggunakan alias opsional avg_hours
.
Bentuk yang disederhanakan hanya mendukung klausa FROM
dan WHERE
. Lihat referensi GQL untuk informasi selengkapnya.
Menghitung beberapa agregasi dalam kueri
Anda dapat menggabungkan beberapa agregasi dalam satu pipeline agregasi. Hal ini dapat mengurangi jumlah pembacaan indeks yang diperlukan. Jika kueri menyertakan agregasi di beberapa kolom, kueri memerlukan indeks komposit, dan setiap penghitungan agregasi hanya menyertakan entitas yang berisi semua kolom yang digunakan oleh setiap agregasi.
Contoh berikut melakukan beberapa agregasi dalam satu kueri agregasi:
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 mendukung formulir sederhana untuk kueri agregasi:
SELECT SUM(hours) AS total_hours, COUNT(*) AS total_tasks FROM tasks WHERE is_done = false AND tag = 'house'
Contoh ini menggunakan alias opsional total_hours
dan total_tasks
.
Bentuk yang disederhanakan hanya mendukung klausa FROM
dan WHERE
. Lihat referensi GQL untuk informasi selengkapnya.
Kueri dengan beberapa agregasi hanya akan menyertakan entity yang berisi semua properti dalam setiap agregasi. Hal ini dapat memberikan hasil yang berbeda jika melakukan setiap agregasi secara terpisah.
Perilaku dan batasan
Saat Anda bekerja dengan kueri agregasi, perhatikan perilaku dan batasan berikut:
- Kueri yang Anda berikan ke agregasi harus memenuhi batasan pada kueri.
Jika kueri agregasi tidak dapat diselesaikan dalam waktu 60 detik, error
DEADLINE_EXCEEDED
akan ditampilkan. Performa bergantung pada konfigurasi indeks Anda dan ukuran set data.Jika operasi tidak dapat diselesaikan dalam batas waktu 60 detik, solusi yang memungkinkan adalah menggunakan kursor untuk menggabungkan beberapa agregasi.
Kueri agregasi yang dibaca dari entri indeks dan hanya menyertakan properti terindeks dalam penghitungan.
Menambahkan klausa
OrderBy
ke kueri akan membatasi agregasi pada entity tempat properti pengurutan berada.Di GQL, bentuk sederhana tidak mendukung klausa
ORDER BY
,LIMIT
, atauOFFSET
.Dalam kueri proyeksi, Anda hanya dapat menggabungkan data dari properti dalam proyeksi. Misalnya, dalam kueri GQL
SELECT a, b FROM k WHERE c = 1
, Anda hanya dapat menggabungkan data daria
ataub
.Agregasi
count()
tidak menghapus duplikat entity dengan properti array. Setiap nilai array yang cocok dengan kueri akan menambahkan satu ke jumlah.Untuk agregasi
sum()
danavg()
, Nilai non-numerik akan diabaikan. Agregasisum()
danavg()
hanya memperhitungkan nilai bilangan bulat, nilai angka floating point, dan stempel waktu. Stempel waktu dikonversi menjadi nilai bilangan bulat mikrodetik untuksum()
,avg()
, dan proyeksi.Saat menggabungkan beberapa agregasi dalam satu kueri, perhatikan bahwa
sum()
danavg()
mengabaikan nilai non-numerik, sedangkancount()
menyertakan nilai non-numerik.Jika Anda menggabungkan agregasi yang berada di properti yang berbeda, penghitungan hanya akan menyertakan entitas yang berisi semua properti tersebut. Hal ini dapat memberikan hasil yang berbeda jika melakukan setiap agregasi secara terpisah.
Harga
Harga untuk kueri agregasi count()
, sum()
, dan avg()
bergantung pada jumlah entri indeks yang dipindai selama operasi. Anda dikenai biaya satu pembacaan entity untuk hingga 1.000 entri indeks yang cocok. Entri indeks berikutnya
cocok dengan biaya unit baca tambahan. Ada biaya minimum sebesar satu unit baca untuk setiap kueri. Untuk mengetahui informasi harga, lihat Harga Firestore dalam mode Datastore.
Jika Anda menggabungkan beberapa agregasi dalam satu kueri, kueri akan menggunakan indeks yang sama untuk setiap agregasi dan melakukan satu pemindaian pada data. Hal ini dapat membantu mengurangi jumlah pemindaian dan pembacaan indeks yang ditagih jika dibandingkan dengan melakukan setiap agregasi secara terpisah. Namun, kueri dengan beberapa agregasi hanya akan menyertakan entity yang berisi semua properti tersebut. Hal ini dapat memberikan hasil yang berbeda jika melakukan setiap agregasi secara terpisah.
Langkah selanjutnya
- Pelajari kueri.
- Pelajari praktik terbaik untuk Firestore dalam mode Datastore.