DynamoDB GSI does not project the requested attribute
TL;DR — Bir Global İkincil İndeks sorguladınız ve (ProjectionExpression veya Select=ALL_ATTRIBUTES aracılığıyla) indeksin projelemediği bir öznitelik istediniz. Bir GSI yalnızca kendi anahtar özniteliklerini, temel tablonun anahtar özniteliklerini ve projeksiyonunda listelediklerinizi döndürür — başka hiçbir şey değil. İsteği ya projelenen özniteliklere daraltın, özniteliği GSI'nin projeksiyonuna ekleyin ya da temel tabloyu birincil anahtara göre sorgulayın.
Ne anlama gelir
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]Bir Yerel İkincil İndeksin (ki ekstra maliyetle temel öğeden projelenmemiş öznitelikleri getirebilir) aksine, bir GSI kendi kendine yeten bir kopyadır. Fiziksel olarak yalnızca projeksiyonundaki öznitelikleri saklar — AWS'nin kendi belgeleri açık sözlüdür: "global secondary index queries cannot fetch attributes from the base table." Bir GSI sorgusundan o kümenin dışında bir şey istemek karşılanamaz, bu yüzden DynamoDB sessizce kısmi veri döndürmek yerine isteği reddeder (bir ValidationException, HTTP 400 — yeniden denenebilir değil).
Neden olur
- Anahtar olmayan bir öznitelik için sorgulanan
ProjectionType: KEYS_ONLYindeksi. NonKeyAttributeslistesinde olmayan bir öznitelik için sorgulananProjectionType: INCLUDEindeksi.ProjectionType: ALLolmayan bir GSI'deSelect: ALL_ATTRIBUTES.- LSI davranışını varsaymak — bir GSI'nin temel tablodan projelenmemiş öznitelikleri getirmesini beklemek (yalnızca LSI'ler bunu yapar).
- Erişim deseni evrildikçe sorgunun ihtiyaçlarından kaymış bir projeksiyon.
Nasıl düzeltilir
- Yalnızca projelenen öznitelikleri isteyin —
ProjectionExpression'ı GSI'nin anahtarları + projelenen kümesiyle sınırlayın ya daSelect: ALL_ATTRIBUTES'ı bırakın. - Özniteliği GSI projeksiyonuna ekleyin — yeni bir öznitelik için, GSI'yi
ProjectionType: INCLUDE(onu listeleyerek) veyaALLile oluşturun/değiştirin. Mevcut GSI'lerin projeksiyonları yerinde düzenlenemez; yeni bir GSI eklersiniz ya da yeniden oluşturursunuz. - Temel tablodan getirin — GSI'nin döndürdüğü anahtarları kullanarak tam öğe için temel tabloda bir
GetItem/BatchGetItemyapın. - Rutin olarak indeksten her özniteliğe ihtiyaç duyuyorsanız
ProjectionType: ALLkullanın (ekstra depolama/yazma maliyetini kabul ederek).
Sorgulamadan önce bir GSI'nin gerçekte hangi öznitelikleri taşıdığını görmek ister misiniz? DynoTable masaüstü uygulaması her indeksin projeksiyonunu gösterir, böylece yalnızca orada olanı istersiniz — does not project sürprizi yok.
İlgili hatalar
- Index not found — indeks adının kendisi yanlış ya da hâlâ oluşturuluyor.
- Query condition missed key schema element — GSI anahtar koşulu eksik.
- Kod örneği: Query a GSI in Node.js — karşılaştırılacak çalışan bir GSI sorgusu.
- Öğrenin: Index projections · GSI vs LSI · Index'ler
Kaynaklar
- 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
En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.