DynamoDB GSI does not project the requested attribute

TL;DR — Anda mengkueri Global Secondary Index dan meminta (via ProjectionExpression atau Select=ALL_ATTRIBUTES) atribut yang tidak diproyeksikan index. GSI hanya mengembalikan atribut kuncinya sendiri, atribut kunci tabel dasar, dan apa pun yang Anda daftarkan dalam proyeksinya — tidak lebih. Entah persempit permintaan ke atribut yang diproyeksikan, tambahkan atribut ke proyeksi GSI, atau kueri tabel dasar berdasarkan primary key.

Apa artinya

ValidationException: One or more parameter values were invalid: Global secondary
index <index_name> does not project <attribute_name>

# or, with Select=ALL_ATTRIBUTES on a KEYS_ONLY / INCLUDE index:
ValidationException: Select type ALL_ATTRIBUTES is not supported for global
secondary index <index_name> because its projection type is not ALL

# what the engine actually returns, reproduced against DynamoDB Local:
ValidationException: One or more parameter values were invalid: Global secondary index gsi1 does not project [unprojected]

Berbeda dengan Local Secondary Index (yang dapat mengambil atribut yang tidak diproyeksikan dari item dasar dengan biaya ekstra), sebuah GSI adalah salinan mandiri. Ia secara fisik menyimpan hanya atribut dalam proyeksinya — dokumen AWS sendiri blak-blakan: "global secondary index queries cannot fetch attributes from the base table." Meminta kueri GSI untuk apa pun di luar set itu tidak dapat dipenuhi, jadi DynamoDB menolak permintaan (ValidationException, HTTP 400 — tidak dapat dicoba ulang) alih-alih diam-diam mengembalikan data parsial.

Mengapa itu terjadi

  • Index ProjectionType: KEYS_ONLY dikueri untuk atribut non-kunci.
  • Index ProjectionType: INCLUDE dikueri untuk atribut yang tidak ada dalam daftar NonKeyAttributes.
  • Select: ALL_ATTRIBUTES pada GSI yang bukan ProjectionType: ALL.
  • Mengasumsikan perilaku LSI — mengharapkan GSI mengambil atribut yang tidak diproyeksikan dari tabel dasar (hanya LSI yang melakukan itu).
  • Proyeksi yang menyimpang dari kebutuhan kueri seiring pola akses berkembang.

Bagaimana cara memperbaikinya

  1. Minta hanya atribut yang diproyeksikan — batasi ProjectionExpression ke kunci GSI + set yang diproyeksikannya, atau hapus Select: ALL_ATTRIBUTES.
  2. Tambahkan atribut ke proyeksi GSI — untuk atribut baru, buat/ganti GSI dengan ProjectionType: INCLUDE (mendaftarkannya) atau ALL. Proyeksi GSI yang ada tidak dapat diedit di tempat; Anda menambahkan GSI baru atau membuatnya ulang.
  3. Ambil dari tabel dasar — gunakan kunci yang memang dikembalikan GSI untuk melakukan GetItem/BatchGetItem pada tabel dasar untuk item penuh.
  4. Gunakan ProjectionType: ALL jika Anda secara rutin butuh setiap atribut dari index (menerima biaya penyimpanan/tulis ekstra).

Ingin melihat atribut mana yang benar-benar dibawa GSI sebelum Anda mengkuerinya? Aplikasi desktop DynoTable menunjukkan proyeksi setiap index sehingga Anda meminta hanya yang ada di sana — tanpa kejutan does not project.

Kesalahan terkait

Referensi

Terakhir diverifikasi 2026-07-13 terhadap 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.