Batasan pada kueri

Halaman ini membahas pembatasan dalam membuat kueri Datastore dari Google App Engine. Daftar berikut adalah batasan umum yang akan Anda temui saat mengembangkan Datastore.

Entity yang tidak memiliki properti yang disebutkan dalam kueri akan diabaikan

Entity dengan jenis yang sama tidak harus memiliki properti yang sama. Agar memenuhi syarat sebagai hasil kueri, entity harus memiliki nilai (mungkin null) untuk setiap properti yang disebutkan dalam filter dan tata urutan kueri. Jika tidak, entity akan dihilangkan dari indeks yang digunakan untuk mengeksekusi kueri dan akibatnya tidak akan disertakan dalam hasil kueri.

Pemfilteran pada properti yang tidak diindeks tidak menampilkan hasil

Kueri tidak dapat menemukan nilai properti yang tidak diindeks, serta tidak dapat mengurutkan properti tersebut. Lihat halaman Indeks Datastore untuk mengetahui pembahasan mendetail tentang properti yang tidak diindeks.

Filter ketidaksetaraan dibatasi maksimal satu properti

Agar tidak perlu memindai seluruh indeks, mekanisme kueri bergantung pada semua hasil potensial kueri yang berdekatan satu sama lain dalam indeks. Untuk memenuhi batasan ini, satu kueri tidak boleh menggunakan perbandingan ketidaksetaraan (<, <=, >, >=, !=) di lebih dari satu properti di semua filternya. Misalnya, kueri berikut valid karena kedua filter ketidaksetaraan berlaku untuk properti yang sama:

SELECT * FROM Person WHERE birth_year >= :min_birth_year
                       AND birth_year <= :max_birth_year

Namun, kueri ini tidak valid karena menggunakan filter ketidaksetaraan pada dua properti yang berbeda:

SELECT * FROM Person WHERE birth_year >= :max_birth_year
                       AND height <= :max_height          # ERROR

Perhatikan bahwa kueri dapat menggabungkan filter kesetaraan (=) untuk berbagai properti, bersama dengan satu atau beberapa filter ketidaksetaraan di satu properti. Dengan demikian, berikut adalah kueri yang valid:

SELECT * FROM Person WHERE last_name = :target_last_name AND city = :target_city AND birth_year >= :min_birth_year AND birth_year <= :max_birth_year

Pengurutan hasil kueri tidak ditentukan jika tidak ada tata urutan yang ditentukan

Jika sebuah kueri tidak menentukan tata urutan, hasilnya akan ditampilkan sesuai urutan pengambilannya. Seiring berkembangnya implementasi Datastore (atau jika indeks aplikasi berubah), urutan ini dapat berubah. Oleh karena itu, jika aplikasi Anda memerlukan hasil kueri dalam urutan tertentu, pastikan untuk menentukan tata urutan tersebut secara eksplisit dalam kueri.

Tata urutan diabaikan pada properti dengan filter kesetaraan

Kueri yang menyertakan filter kesetaraan untuk properti tertentu akan mengabaikan tata urutan yang ditentukan untuk properti tersebut. Ini adalah pengoptimalan sederhana untuk menyimpan pemrosesan yang tidak perlu untuk properti bernilai tunggal, karena semua hasil memiliki nilai yang sama untuk properti tersebut sehingga tidak perlu penyortiran lebih lanjut. Namun, properti dengan beberapa nilai dapat memiliki nilai tambahan selain yang cocok dengan filter kesetaraan. Karena kasus penggunaan ini jarang terjadi dan penerapan tata urutan akan mahal serta memerlukan indeks tambahan, perencana kueri Datastore mengabaikan tata urutan bahkan dalam kasus multinilai. Hal ini dapat menyebabkan hasil kueri ditampilkan dalam urutan yang berbeda dari yang disiratkan oleh tata urutan.

Properti yang digunakan dalam filter ketidaksetaraan harus diurutkan terlebih dahulu

Untuk mengambil semua hasil yang cocok dengan filter ketidaksetaraan, kueri memindai indeks untuk mencari baris pertama yang cocok dengan filter, lalu memindainya hingga menemukan baris yang tidak cocok. Agar baris berurutan mencakup kumpulan hasil lengkap, baris tersebut harus diurutkan berdasarkan properti yang digunakan dalam filter ketidaksetaraan sebelum properti lainnya. Jadi, jika kueri menentukan satu atau beberapa filter ketidaksetaraan beserta satu atau beberapa tata urutan, tata urutan pertama harus merujuk ke properti yang sama yang dinamai dalam filter ketidaksetaraan. Berikut ini adalah kueri yang valid:

SELECT * FROM Person WHERE birth_year >= :min_birth_year ORDER BY birth_year, last_name

Kueri ini tidak valid, karena tidak mengurutkan properti yang digunakan dalam filter ketidaksetaraan:

SELECT * FROM Person WHERE birth_year >= :min_birth_year ORDER BY last_name # ERROR

Demikian pula, kueri ini tidak valid karena properti yang digunakan dalam filter ketidaksetaraan bukan yang pertama diurutkan:

SELECT * FROM Person WHERE birth_year >= :min_birth_year
                     ORDER BY last_name, birth_year       # ERROR

Properti dengan beberapa nilai dapat berperilaku secara mengejutkan

Karena cara pengindeksannya, entity dengan beberapa nilai untuk properti yang sama terkadang dapat berinteraksi dengan filter kueri dan mengurutkan urutan dengan cara yang tidak terduga dan mengejutkan.

Jika kueri memiliki beberapa filter ketidaksetaraan di properti tertentu, entity akan cocok dengan kueri tersebut hanya jika setidaknya salah satu nilai individunya untuk properti tersebut memenuhi semua filter. Misalnya, jika suatu entity jenis Widget memiliki nilai 1 dan 2 untuk properti x, entity tersebut tidak akan cocok dengan kueri:

SELECT * FROM Widget WHERE x > 1
                       AND x < 2

Setiap nilai x entitas memenuhi salah satu filter, tetapi tidak ada nilai tunggal yang memenuhi keduanya. Perhatikan bahwa ini tidak berlaku untuk filter kesetaraan. Misalnya, entitas yang sama akan memenuhi kueri

SELECT * FROM Widget WHERE x = 1
                       AND x = 2

meskipun tidak satu pun nilai x individual dari entity tersebut memenuhi kedua kondisi filter.

Operator tidak setara (!=) berfungsi sebagai pengujian "nilai selain dari". Misalnya, kueri

SELECT * FROM Widget WHERE x != 1

cocok dengan entity Widget dengan nilai x selain 1.

Demikian pula, tata urutan untuk properti dengan banyak nilai tidak biasa. Karena properti tersebut muncul sekali dalam indeks untuk setiap nilai unik, nilai pertama yang terlihat di indeks akan menentukan tata urutan entity:

  • Jika hasil kueri diurutkan dalam urutan menaik, nilai terkecil dari properti akan digunakan untuk pengurutan.
  • Jika hasil diurutkan dalam urutan menurun, nilai terbesar digunakan untuk pengurutan.
  • Nilai lainnya tidak memengaruhi tata urutan, begitu juga jumlah nilai.

Hal ini memiliki konsekuensi yang tidak biasa, yaitu entity dengan nilai properti 1 dan 9 mendahului satu dengan nilai 4, 5, 6, dan 7 dalam urutan menaik dan menurun.

Kueri dalam transaksi harus menyertakan filter ancestor

Transaksi Datastore hanya beroperasi pada entity yang termasuk dalam entity group yang sama (turunan dari ancestor yang sama). Untuk mempertahankan batasan ini, semua kueri yang dilakukan dalam transaksi harus menyertakan filter ancestor yang menentukan ancestor dalam entity group yang sama dengan operasi lain dalam transaksi.