DynamoDB GSI does not project the requested attribute

In breve — Hai interrogato un Global Secondary Index e hai chiesto (tramite ProjectionExpression o Select=ALL_ATTRIBUTES) un attributo che l'indice non proietta. Un GSI restituisce solo i propri attributi chiave, gli attributi chiave della tabella base, e qualunque cosa hai elencato nella sua proiezione — nient'altro. Restringi la richiesta agli attributi proiettati, aggiungi l'attributo alla proiezione del GSI, oppure interroga la tabella base per chiave primaria.

Cosa significa

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]

A differenza di un Local Secondary Index (che può recuperare attributi non proiettati dall'Item base a costo aggiuntivo), un GSI è una copia autonoma. Memorizza fisicamente solo gli attributi nella sua proiezione — la documentazione di AWS è categorica: "le query sull'indice secondario globale non possono recuperare attributi dalla tabella base." Chiedere a una query su GSI qualcosa al di fuori di quell'insieme non è soddisfacibile, quindi DynamoDB rifiuta la richiesta (una ValidationException, HTTP 400 — non ripetibile) invece di restituire silenziosamente dati parziali.

Perché succede

  • Indice ProjectionType: KEYS_ONLY interrogato per un attributo non-chiave.
  • Indice ProjectionType: INCLUDE interrogato per un attributo non presente nella lista NonKeyAttributes.
  • Select: ALL_ATTRIBUTES su un GSI che non è ProjectionType: ALL.
  • Presumere il comportamento LSI — aspettarsi che un GSI recuperi attributi non proiettati dalla tabella base (solo gli LSI lo fanno).
  • Una proiezione che è derivata rispetto alle esigenze della query man mano che il pattern di accesso è evoluto.

Come risolverlo

  1. Richiedi solo attributi proiettati — restringi ProjectionExpression alle chiavi del GSI + il suo insieme proiettato, o rimuovi Select: ALL_ATTRIBUTES.
  2. Aggiungi l'attributo alla proiezione del GSI — per un nuovo attributo, crea/sostituisci il GSI con ProjectionType: INCLUDE (elencandolo) o ALL. Le proiezioni dei GSI esistenti non possono essere modificate in-place; aggiungi un nuovo GSI o ricrealo.
  3. Recupera dalla tabella base — usa le chiavi che il GSI restituisce per fare un GetItem/BatchGetItem sulla tabella base per l'Item completo.
  4. Usa ProjectionType: ALL se hai regolarmente bisogno di ogni attributo dall'indice (accettando il costo aggiuntivo di storage/scrittura).

Vuoi vedere quali attributi un GSI trasporta effettivamente prima di interrogarlo? L'app desktop DynoTable mostra la proiezione di ogni indice così richiedi solo ciò che è presente — nessuna sorpresa does not project.

Errori correlati

Riferimenti

Ultima verifica 2026-07-13 rispetto alla documentazione ufficiale AWS collegata sopra.

Lavora con DynamoDB senza la Console

Un client desktop veloce per DynamoDB che esegue il vero SQL che DynamoDB non può — JOINs, GROUP BY, aggregazioni — con modifica visuale e un agente AI sulle tue chiavi Bedrock.

Prova gratuita di 30 giorni, senza carta di credito — poi il piano Free senza limiti di tempo.