DynamoDB GSI does not project the requested attribute
TL;DR — Você consultou um Global Secondary Index e pediu (via ProjectionExpression ou Select=ALL_ATTRIBUTES) um atributo que o índice não projeta. Um GSI só retorna seus próprios atributos de chave, os atributos de chave da tabela base, e o que quer que você tenha listado em sua projeção — nada mais. Ou estreite a requisição para atributos projetados, adicione o atributo à projeção do GSI, ou consulte a tabela base pela chave primária.
O que 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]Ao contrário de um Local Secondary Index (que pode buscar atributos não projetados do item base a um custo extra), um GSI é uma cópia autocontida. Ele armazena fisicamente apenas os atributos em sua projeção — os próprios docs da AWS são diretos: "global secondary index queries cannot fetch attributes from the base table." Pedir a uma consulta de GSI qualquer coisa fora desse conjunto é insatisfazível, então o DynamoDB rejeita a requisição (um ValidationException, HTTP 400 — não retentável) em vez de retornar dados parciais silenciosamente.
Por que isso acontece
- Índice
ProjectionType: KEYS_ONLYconsultado por um atributo que não é chave. - Índice
ProjectionType: INCLUDEconsultado por um atributo que não está na listaNonKeyAttributes. Select: ALL_ATTRIBUTESem um GSI que não éProjectionType: ALL.- Supor comportamento de LSI — esperar que um GSI busque atributos não projetados da tabela base (apenas LSIs fazem isso).
- Uma projeção que desviou das necessidades da consulta conforme o padrão de acesso evoluiu.
Como corrigir
- Solicite apenas atributos projetados — restrinja
ProjectionExpressionàs chaves do GSI + seu conjunto projetado, ou removaSelect: ALL_ATTRIBUTES. - Adicione o atributo à projeção do GSI — para um novo atributo, crie/substitua o GSI com
ProjectionType: INCLUDE(listando-o) ouALL. As projeções de GSIs existentes não podem ser editadas no lugar; você adiciona um novo GSI ou o recria. - Busque da tabela base — use as chaves que o GSI de fato retorna para fazer um
GetItem/BatchGetItemna tabela base para o item completo. - Use
ProjectionType: ALLse você rotineiramente precisa de todo atributo do índice (aceitando o custo extra de armazenamento/escrita).
Quer ver quais atributos um GSI de fato carrega antes de consultá-lo? O app desktop DynoTable mostra a projeção de cada índice para que você solicite apenas o que está lá — sem surpresa de does not project.
Erros relacionados
- Index not found — o próprio nome do índice está errado ou ainda sendo construído.
- Query condition missed key schema element — a condição de chave do GSI está incompleta.
- Exemplo de código: Query a GSI in Node.js — uma consulta de GSI funcional para comparar.
- Aprenda: Index projections · GSI vs LSI · Índices
Referências
- 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
Verificado pela última vez em 2026-07-13 contra a documentação oficial da AWS vinculada acima.