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 lebih murah daripada mengambil setiap entity untuk diproses. Baca halaman ini untuk mempelajari cara menggunakan kueri agregasi.
Agregasi count()
Gunakan agregasi count()
untuk menampilkan jumlah total entitas terindeks yang cocok dengan kueri tertentu. Misalnya, agregasi count()
ini menampilkan
jumlah total entity dalam suatu 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 kueri count()
yang disederhanakan:
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 mengetahui informasi selengkapnya.
Agregasi count()
memperhitungkan semua filter pada kueri dan klausa limit
. Misalnya, agregasi berikut menampilkan hitungan
jumlah entitas yang cocok dengan filter tertentu.
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 kueri count()
yang disederhanakan:
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 mengetahui informasi selengkapnya.
Contoh ini menunjukkan cara menghitung hingga nilai tertentu. Anda dapat menggunakannya untuk, misalnya, menghentikan penghitungan pada jumlah tertentu dan memberi tahu pengguna bahwa mereka melebihi 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 kueri count_up_to()
yang disederhanakan:
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 mengetahui 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 dari properti tertentu dari
entitas 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 kueri sum()
yang disederhanakan:
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 mengetahui 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 yang diberikan.
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 kueri sum()
yang disederhanakan:
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 mengetahui 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
aritmatika 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 kueri avg()
yang disederhanakan:
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 mengetahui informasi selengkapnya.
Agregasi avg()
memperhitungkan semua filter pada kueri dan klausa limit
. Misalnya, agregasi berikut menampilkan rata-rata
aritmatika 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 kueri avg()
yang disederhanakan:
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 mengetahui 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 perhitungan 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 bentuk yang disederhanakan 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 mengetahui 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 yang disederhanakan 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 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 ditagih satu
pembacaan entitas untuk hingga 1.000 entri indeks yang cocok. Entri indeks berikutnya yang cocok akan dikenai 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 terhadap data. Hal ini dapat membantu mengurangi jumlah pemindaian dan pembacaan indeks yang ditagih dibandingkan dengan melakukan setiap agregasi secara terpisah. Namun, kueri dengan beberapa agregasi hanya menyertakan entity yang berisi semua properti tersebut. Hal ini dapat memberikan hasil yang berbeda jika melakukan setiap agregasi secara terpisah.
Langkah berikutnya
- Pelajari kueri.
- Pelajari praktik terbaik untuk Firestore dalam mode Datastore.