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_ONLYdikueri untuk atribut non-kunci. - Index
ProjectionType: INCLUDEdikueri untuk atribut yang tidak ada dalam daftarNonKeyAttributes. Select: ALL_ATTRIBUTESpada GSI yang bukanProjectionType: 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
- Minta hanya atribut yang diproyeksikan — batasi
ProjectionExpressionke kunci GSI + set yang diproyeksikannya, atau hapusSelect: ALL_ATTRIBUTES. - Tambahkan atribut ke proyeksi GSI — untuk atribut baru, buat/ganti GSI dengan
ProjectionType: INCLUDE(mendaftarkannya) atauALL. Proyeksi GSI yang ada tidak dapat diedit di tempat; Anda menambahkan GSI baru atau membuatnya ulang. - Ambil dari tabel dasar — gunakan kunci yang memang dikembalikan GSI untuk melakukan
GetItem/BatchGetItempada tabel dasar untuk item penuh. - Gunakan
ProjectionType: ALLjika 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
- Index not found — nama index itu sendiri salah atau masih dibangun.
- Query condition missed key schema element — key condition GSI tidak lengkap.
- Contoh kode: Query a GSI in Node.js — kueri GSI yang berfungsi untuk dibandingkan.
- Pelajari: Index projections · GSI vs LSI · Index
Referensi
- Using Global Secondary Indexes in DynamoDB — Amazon DynamoDB Developer Guide
- Managing Global Secondary Indexes in DynamoDB — Amazon DynamoDB Developer Guide
- Query — Amazon DynamoDB API Reference
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
Terakhir diverifikasi 2026-07-13 terhadap dokumentasi resmi AWS yang ditautkan di atas.