Kueri agregasi memproses data dari beberapa entity terindeks untuk menampilkan satu nilai ringkasan. Firestore dalam mode Datastore mendukung kueri agregasi berikut:
count()
sum()
avg()
Kueri agregasi menyederhanakan kode aplikasi dan biayanya 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 entity 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
.
Formulir 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 entity 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 kueri count()
yang disederhanakan:
SELECT COUNT(*) AS total FROM tasks WHERE is_done = false AND tag = 'house'
Contoh ini menggunakan alias opsional total
.
Formulir 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, berhenti menghitung pada angka tertentu dan memberi tahu pengguna bahwa mereka melebihi angka 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
.
Formulir 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 properti yang diberikan dari
entity dari jenis yang ditentukan:
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
.
Formulir 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
.
Formulir 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 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 kueri avg()
yang disederhanakan:
SELECT AVG(hours) as avg_hours
Contoh ini menggunakan alias opsional avg_hours
.
Formulir 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 aritmetika
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
.
Formulir 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 tersebut memerlukan indeks komposit, dan setiap penghitungan agregasi hanya menyertakan entity 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 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
.
Formulir yang disederhanakan hanya mendukung klausa FROM
dan WHERE
. Lihat referensi GQL untuk mengetahui informasi selengkapnya.
Kueri dengan beberapa agregasi hanya menyertakan entity yang berisi semua properti di setiap agregasi. Hal ini dapat menyebabkan hasil yang berbeda karena setiap agregasi dilakukan 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, kueri akan menampilkan error
DEADLINE_EXCEEDED
. 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 cursors untuk menggabungkan beberapa agregasi.
Kueri agregasi membaca dari entri indeks dan hanya menyertakan properti yang diindeks dalam penghitungan.
Menambahkan klausa
OrderBy
ke kueri akan membatasi agregasi pada entity tempat properti pengurutan berada.Di GQL, formulir 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 dari antaraa
ataub
.Agregasi
count()
tidak menghapus duplikat entity dengan properti array. Setiap nilai array yang cocok dengan kueri akan menambahkan satu nilai 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 menyertakan entity yang berisi semua properti tersebut. Hal ini dapat menyebabkan 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 akan ditagih untuk satu entitas yang dibaca hingga 1.000 entri indeks yang cocok. Entri indeks berikutnya yang cocok dengan biaya unit baca tambahan. Ada biaya minimum satu unit baca
untuk setiap kueri. Untuk mengetahui informasi harga, lihat Firestore dalam harga 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 indeks dan pembacaan yang ditagih jika 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 selanjutnya
- Pelajari kueri.
- Pelajari praktik terbaik untuk Firestore dalam mode Datastore.