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: pk

FilterExpression 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 ValidationExceptionsisi klien dan tidak dapat dicoba ulang hingga Anda melakukan restrukturisasi.

Mengapa itu terjadi

  • Kondisi kunci ditulis sebagai filterFilterExpression: 'sk = :v' dengan sk sebagai kunci pengurutan; itu milik KeyConditionExpression.
  • Pemfilteran pada kunci indeks — saat Anda melakukan Query dan 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

  1. Pindahkan kondisi kunci ke KeyConditionExpression:
    KeyConditionExpression: 'pk = :pk AND begins_with(sk, :prefix)',
    // FilterExpression: only NON-key attributes, e.g. 'status = :active'
  2. 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.
  3. 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.
  4. Mengkueri GSI? Ingat bahwa atribut kuncinya juga terlarang di dalam filter — beri kondisi pada atribut itu di kondisi kunci.
  5. Audit permintaan yang dihasilkan. Catat KeyConditionExpression dan FilterExpression bersama-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

Kesalahan terkait

Referensi

Terakhir diverifikasi 2026-07-13 berdasarkan dokumentasi resmi AWS yang ditautkan di atas.

Bekerja dengan DynamoDB tanpa Console

Klien desktop DynamoDB yang cepat dan menjalankan SQL sungguhan yang tidak bisa dijalankan DynamoDB — JOINs, GROUP BY, agregasi — dengan editing visual dan agen AI pada kunci Bedrock milik Anda sendiri.

Uji coba gratis 30 hari, tanpa kartu kredit — lalu paket Free tanpa batas waktu.