Filter Ekspresi hanya dapat berisi atribut non-kunci utama
TL;DR — Anda memasukkan atribut kunci utama (kunci partisi atau kunci pengurutan — dari tabel atau indeks yang Anda kueri) di dalam FilterExpression. DynamoDB melarang: atribut kunci masuk ke KeyConditionExpression, dan filter hanya dapat mereferensikan atribut non-kunci. Pindahkan kondisi kunci ke tempatnya.
Apa artinya
ValidationException: Filter Expression can only contain non-primary key attributes:
Primary key attribute: <name>
# what the engine actually returns, reproduced against DynamoDB Local:
ValidationException: Filter Expression can only contain non-primary key attributes: Primary key attribute: pkFilterExpression berjalan setelah item dibaca, untuk membuang baris yang tidak Anda inginkan; KeyConditionExpression berjalan sebelum, untuk memilih item mana yang dibaca berdasarkan kunci. Merujuk kunci partisi/sort di filter akan menggabungkan peran tersebut, sehingga DynamoDB menolaknya dengan HTTP 400 ValidationException — sisi klien dan tidak dapat dicoba ulang hingga Anda melakukan restrukturisasi.
Mengapa itu terjadi
- Kondisi kunci ditulis sebagai filter —
FilterExpression: 'sk = :v'dengansksebagai kunci pengurutan; itu milikKeyConditionExpression. - Pemfilteran pada kunci indeks — saat Anda melakukan
Querydan GSI/LSI, kunci partisi/sort milik indeks tersebut adalah "atribut kunci utama" untuk kueri ini dan tidak dapat muncul di filter. - Menyalin-menempelkan filter pindaian ke kueri dengan satu atribut yang difilter menjadi kuncinya.
- Mencoba menambahkan kondisi kedua pada kunci pengurutan melalui filter (misalnya rentang) alih-alih menyatakannya dalam kondisi kunci.
Bagaimana cara memperbaikinya
- Pindahkan kondisi kunci ke
KeyConditionExpression:KeyConditionExpression: 'pk = :pk AND begins_with(sk, :prefix)', // FilterExpression: only NON-key attributes, e.g. 'status = :active' - Gunakan indeks yang tepat. Jika Anda perlu memfilter/memilih pada atribut yang bukan kunci, modelkan atribut itu sebagai kunci partisi/sort sebuah GSI dan kueri indeks tersebut berdasarkan kunci.
- Simpan filter untuk atribut non-kunci saja — filter memangkas hasil tetapi tetap memakan kapasitas baca untuk setiap item yang dipindai, jadi andalkan kunci/indeks untuk seleksi.
- Mengkueri GSI? Ingat bahwa atribut kuncinya juga terlarang di dalam filter — beri kondisi pada atribut itu di kondisi kunci.
- Audit permintaan yang dihasilkan. Catat
KeyConditionExpressiondanFilterExpressionbersama-sama — atribut kunci di dalam filter adalah kesalahan salin-tempel yang umum dari kode Scan.
Jalankan di DynoTable
Panel kueri DynoTable menyimpan kondisi dan filter utama di bidang terpisah — batasan kunci partisi dan pengurutan tidak pernah ada di FilterExpression. Buka tabel dengan ⌘K, atur kondisi kunci, lalu tambahkan filter non-kunci; salin permintaan yang dihasilkan ke SDK Anda.
Gunakan Pembuat Kueri untuk membuat prototipe kueri GSI dengan kunci indeks harus tetap berada di KeyConditionExpression. Ganti profil dengan ⌘P; Uji Koneksi pada Pengaturan → Profil mengonfirmasi keberadaan indeks. Lihat Menghubungkan ke AWS dan Instal.
Sumber
- Kueri — Referensi Amazon DynamoDB API (diverifikasi 13-07-2026)
- Memfilter ekspresi untuk Kueri (diverifikasi 13-07-2026)
Kesalahan terkait
- Kondisi kunci kueri tidak didukung — operator/shape yang tidak valid dalam kondisi kunci itu sendiri.
- Kondisi kueri elemen skema kunci tidak ada — kueri tidak menyediakan kunci partisi.
- Contoh kode: Query in Node.js — kondisi kunci dan filter dipisahkan dengan benar.
- Pelajari: Strategi pemfilteran · Ekspresi kondisi utama
Referensi
- Kueri — Referensi Amazon DynamoDB API
- Memfilter ekspresi untuk Kueri — Panduan Pengembang Amazon DynamoDB
- Menggunakan Indeks Sekunder Global di DynamoDB — Panduan Pengembang Amazon DynamoDB
Terakhir diverifikasi 2026-07-13 berdasarkan dokumentasi resmi AWS yang ditautkan di atas.