Ringkasan kueri dengan filter rentang dan ketidaksetaraan di beberapa properti

Firestore dalam mode Datastore mendukung penggunaan filter rentang dan ketidaksetaraan di beberapa properti dalam satu kueri. Anda kini dapat memiliki kondisi rentang dan ketidaksetaraan di beberapa properti dan menyederhanakan pengembangan aplikasi dengan mendelegasikan implementasi logika pasca-pemfilteran ke Firestore dalam mode Datastore.

Filter rentang dan ketidaksetaraan di beberapa properti

Kueri berikut menampilkan semua pengguna yang usianya lebih besar dari 35 tahun dan tingginya antara 60 dan 70 tahun menggunakan filter rentang berdasarkan usia dan tinggi.

GQL

 SELECT * FROM /users WHERE age > 35 AND height > 60 AND height < 70;

Java


  Query<Entity> query =
    Query.newEntityQueryBuilder()
      .setKind("users")
      .setFilter(
        CompositeFilter.and(
            PropertyFilter.gt("age", 35), PropertyFilter.gt("height", 60), PropertyFilter.lt("height", 70)))
    .build();

Pertimbangan pengindeksan

Sebelum mulai menjalankan kueri, pastikan Anda telah membaca tentang kueri.

Jika klausa ORDER BY tidak ditentukan, Firestore dalam mode Datastore akan menggunakan indeks apa pun yang dapat memenuhi kondisi filter kueri untuk menayangkan kueri, sehingga menghasilkan kumpulan hasil yang diurutkan sesuai dengan definisi indeks.

Untuk mengoptimalkan performa dan biaya Firestore dalam kueri mode Datastore, Anda harus mengoptimalkan urutan properti dalam indeks. Untuk melakukannya, pastikan indeks Anda diurutkan dari kiri ke kanan sehingga kueri akan disaring ke set data yang mencegah pemindaian entri indeks yang tidak relevan.

Misalkan Anda ingin menelusuri kumpulan karyawan dan mencari karyawan yang gajinya lebih dari 100.000 dan yang jumlah tahun pengalamannya lebih besar dari 0. Berdasarkan pemahaman Anda tentang {i>dataset<i}, Anda tahu bahwa batasan gaji lebih selektif daripada batasan pengalaman. Indeks ideal yang akan mengurangi jumlah pemindaian indeks adalah indeks (salary [...], experience [...]). Dengan demikian, kueri yang cepat dan hemat biaya akan mengurutkan salary sebelum experience dan terlihat seperti berikut:

GQL

SELECT *
FROM /employees
WHERE salary > 100000 AND experience > 0
ORDER BY salary, experience

Java

Query<Entity> query =
  Query.newEntityQueryBuilder()
    .setKind("employees")
    .setFilter(
        CompositeFilter.and(
            PropertyFilter.gt("salary", 100000), PropertyFilter.gt("experience", 0)))
    .setOrderBy(OrderBy("salary"), OrderBy("experience"))
    .build();

Node.js

const query = datastore
  .createQuery("employees")
  .filter(
    and([
      new PropertyFilter("salary", ">", 100000),
      new PropertyFilter("experience", ">", 0),
       ])
    )
  .order("salary")
  .order("experience");

Python

query = client.query(kind="employees")
query.add_filter("salary", ">", 100000)
query.add_filter("experience", ">", 0)
query.order = ["-salary", "-experience"]

Praktik terbaik untuk mengoptimalkan indeks

Saat mengoptimalkan indeks, perhatikan praktik terbaik berikut.

Mengurutkan kueri berdasarkan kesetaraan diikuti dengan kolom ketidaksetaraan atau rentang yang paling selektif

Firestore dalam mode Datastore menggunakan properti paling kiri dari indeks komposit untuk memenuhi batasan kesetaraan serta batasan rentang & ketidaksetaraan, jika ada, di kolom pertama kueri orderBy(). Batasan ini dapat mengurangi jumlah entri indeks yang dipindai Firestore dalam mode Datastore. Firestore dalam mode Datastore menggunakan properti indeks yang tersisa untuk memenuhi batasan rentang & ketidaksetaraan lainnya dari kueri. Batasan ini tidak mengurangi jumlah entri indeks yang dipindai Firestore dalam mode Datastore, tetapi memfilter entity yang tidak cocok sehingga jumlah entity yang ditampilkan ke klien berkurang.

Untuk mengetahui informasi lebih lanjut mengenai cara membuat indeks yang efisien, baca struktur dan definisi indeks serta mengoptimalkan indeks.

Mengurutkan properti dalam mengurangi urutan selektivitas batasan kueri

Untuk memastikan bahwa Firestore dalam mode Datastore memilih indeks optimal untuk kueri Anda, tentukan klausa orderBy() yang mengurutkan properti rentang & ketidaksetaraan dalam mengurangi urutan selektivitas batasan kueri. Selektif yang lebih tinggi cocok dengan sebagian kecil entity, sementara selektivitas yang lebih rendah cocok dengan sebagian besar entitas. Pastikan Anda memilih properti rentang & ketidaksetaraan dengan selektivitas lebih tinggi lebih awal dalam pengurutan indeks daripada properti dengan selektivitas rendah.

Untuk meminimalkan jumlah entity yang dipindai dan ditampilkan Firestore dalam mode Datastore melalui jaringan, Anda harus selalu mengurutkan properti dalam urutan selektivitas batasan kueri yang menurun. Jika kumpulan hasil tidak dalam urutan yang diperlukan dan kumpulan hasil diharapkan berukuran kecil, Anda dapat menerapkan logika sisi klien untuk mengurutkan ulang sesuai ekspektasi pengurutan.

Misalnya, Anda ingin menelusuri koleksi karyawan untuk menemukan karyawan yang gajinya lebih dari 100.000 dan mengurutkan hasilnya berdasarkan tahun pengalaman karyawan tersebut. Jika Anda memperkirakan hanya sejumlah kecil karyawan yang akan memiliki gaji lebih dari 100.000, cara paling efisien untuk menulis kueri adalah sebagai berikut:

Java

Query<Entity> query =
  Query.newEntityQueryBuilder()
    .setKind("employees")
    .setFilter(PropertyFilter.gt("salary", 100000))
    .setOrderBy(OrderBy("salary"))
    .build();
QueryResults<Entity> results = datastore.run(query);
// Order results by `experience`

Node.js

const query = datastore
  .createQuery("employees")
  .filter(new PropertyFilter("salary", ">", 100000))
  .order("salary");
const [entities] = await datastore.runQuery(query);
// Order results by `experience`

Python

query = client.query(kind="employees")
query.add_filter("salary", ">", 100000)
query.order = ["salary"]
results = query.fetch()
// Order results by `experience`

Meskipun menambahkan pengurutan pada experience ke kueri akan menghasilkan kumpulan entity yang sama dan menghilangkan pengurutan ulang hasilnya di klien, kueri dapat membaca lebih banyak entri indeks yang tidak relevan daripada kueri sebelumnya. Hal ini dikarenakan Firestore dalam mode Datastore selalu lebih memilih indeks yang awalan properti indeksnya cocok dengan urutan demi klausa kueri. Jika experience ditambahkan ke urutan berdasarkan klausa, Firestore dalam mode Datastore akan memilih indeks (experience [...], salary [...]) untuk menghitung hasil kueri. Karena tidak ada batasan lain pada experience, Firestore dalam mode Datastore akan membaca semua entri indeks dari koleksi employees sebelum menerapkan filter salary untuk menemukan kumpulan hasil akhir. Artinya, entri indeks yang tidak memenuhi filter salary akan tetap dibaca, sehingga meningkatkan latensi dan biaya kueri.

Harga

Kueri dengan filter rentang dan ketidaksetaraan di beberapa properti akan ditagih berdasarkan pembacaan entity dan entri indeks yang dibaca.

Untuk mengetahui informasi selengkapnya, lihat halaman Harga.

Batasan

Selain batasan kueri, perhatikan batasan berikut sebelum menggunakan kueri dengan filter rentang dan ketidaksetaraan di beberapa properti:

  • Firestore dalam mode Datastore membatasi jumlah operator rentang atau ketidaksetaraan hingga 10. Hal ini untuk mencegah kueri menjadi terlalu mahal untuk dijalankan.

Langkah Berikutnya