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_ONLY indeksi.
  • NonKeyAttributes listesinde olmayan bir öznitelik için sorgulanan ProjectionType: INCLUDE indeksi.
  • ProjectionType: ALL olmayan bir GSI'de Select: 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

  1. Yalnızca projelenen öznitelikleri isteyinProjectionExpression'ı GSI'nin anahtarları + projelenen kümesiyle sınırlayın ya da Select: ALL_ATTRIBUTES'ı bırakın.
  2. Özniteliği GSI projeksiyonuna ekleyin — yeni bir öznitelik için, GSI'yi ProjectionType: INCLUDE (onu listeleyerek) veya ALL ile oluşturun/değiştirin. Mevcut GSI'lerin projeksiyonları yerinde düzenlenemez; yeni bir GSI eklersiniz ya da yeniden oluşturursunuz.
  3. Temel tablodan getirin — GSI'nin döndürdüğü anahtarları kullanarak tam öğe için temel tabloda bir GetItem/BatchGetItem yapın.
  4. Rutin olarak indeksten her özniteliğe ihtiyaç duyuyorsanız ProjectionType: ALL kullanı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

Kaynaklar

En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.

Console olmadan DynamoDB ile çalış

DynamoDB’nin çalıştıramadığı gerçek SQL’i çalıştıran hızlı bir DynamoDB masaüstü istemcisi — JOINs, GROUP BY, toplamalar — görsel düzenleme ve kendi Bedrock anahtarların üzerinde bir yapay zekâ aracısıyla.

30 günlük ücretsiz deneme, kredi kartı yok — ardından süre sınırı olmayan Ücretsiz plan.