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_ONLYinterrogato per un attributo non-chiave. - Indice
ProjectionType: INCLUDEinterrogato per un attributo non presente nella listaNonKeyAttributes. Select: ALL_ATTRIBUTESsu 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
- Richiedi solo attributi proiettati — restringi
ProjectionExpressionalle chiavi del GSI + il suo insieme proiettato, o rimuoviSelect: ALL_ATTRIBUTES. - Aggiungi l'attributo alla proiezione del GSI — per un nuovo attributo, crea/sostituisci il GSI con
ProjectionType: INCLUDE(elencandolo) oALL. Le proiezioni dei GSI esistenti non possono essere modificate in-place; aggiungi un nuovo GSI o ricrealo. - Recupera dalla tabella base — usa le chiavi che il GSI restituisce per fare un
GetItem/BatchGetItemsulla tabella base per l'Item completo. - Usa
ProjectionType: ALLse 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
- Index not found — il nome dell'indice stesso è errato o ancora in costruzione.
- Query condition missed key schema element — la condizione sulla chiave del GSI è incompleta.
- Esempio di codice: Query a GSI in Node.js — una query su GSI funzionante da confrontare.
- Impara: Index projections · GSI vs LSI · Indici
Riferimenti
- 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
Ultima verifica 2026-07-13 rispetto alla documentazione ufficiale AWS collegata sopra.