Expressão de filtro só pode conter atributos de chave não primária

TL;DR — Você coloca um atributo de chave primária (chave de partição ou chave de classificação — da tabela ou índice que você está consultando) dentro de um FilterExpression. O DynamoDB proíbe que: atributos-chave vão para o KeyConditionExpression e um filtro só pode fazer referência a atributos não-chave. Mova a condição-chave para onde ela pertence.

O que significa

ValidationException: Filter Expression can only contain non-primary key attributes:
Primary key attribute: <name>

# what the engine actually returns, reproduced against DynamoDB Local:
ValidationException: Filter Expression can only contain non-primary key attributes: Primary key attribute: pk

FilterExpression é executado após a leitura dos itens, para descartar linhas que você não deseja; KeyConditionExpression é executado antes, para selecionar quais itens serão lidos por chave. Fazer referência a uma chave de partição/classificação no filtro mistura essas funções, portanto o DynamoDB a rejeita com um HTTP 400 ValidationExceptiondo lado do cliente e não pode ser repetida até que você reestruture.

Por que isso acontece

  • Uma condição chave escrita como um filtroFilterExpression: 'sk = :v' onde sk é a chave de classificação; ele pertence ao KeyConditionExpression.
  • Filtragem na chave do índice — quando você Query um GSI/LSI, a própria chave partição/sort desse índice são "atributos de chave primária" para esta consulta e não podem aparecer no filtro.
  • Copiar e colar um filtro de varredura em uma consulta onde um atributo filtrado é uma chave.
  • Tentando adicionar uma segunda condição na chave de classificação através do filtro (por exemplo, um intervalo) em vez de expressá-la na condição chave.

Como corrigir

  1. Mova as condições de chave para o KeyConditionExpression:
    KeyConditionExpression: 'pk = :pk AND begins_with(sk, :prefix)',
    // FilterExpression: only NON-key attributes, e.g. 'status = :active'
  2. Use o índice certo. Se você precisa filtrar/selecionar por um atributo que não é chave, modele-o como chave de partição/classificação de um GSI e consulte esse índice por chave.
  3. Deixe o filtro só para atributos que não são chave — ele reduz os resultados, mas ainda consome capacidade de leitura para cada item varrido, então apoie-se em chaves/índices para a seleção.
  4. Consultando um GSI? Lembre-se de que os atributos de chave dele também estão fora dos limites do filtro — condicione-os na key condition.
  5. Audite as requisições geradas. Registre KeyConditionExpression e FilterExpression juntos — atributos de chave no filtro são um erro comum de copiar e colar de código de Scan.

Execute no DynoTable

O painel de consulta do DynoTable mantém condições de chave e filtros em campos separados — restrições de chave de partição e de ordenação nunca caem no FilterExpression. Abra uma tabela com ⌘K, defina a condição de chave e então adicione filtros que não sejam de chave; copie a requisição gerada para o seu SDK.

Use o Query Builder para prototipar consultas a GSI, onde as chaves do índice precisam ficar no KeyConditionExpression. Troque de perfil com ⌘P; o Testar conexão em Configurações → Perfis confirma que o índice existe. Consulte Conectar ao AWS e Instalar.

Fontes

Erros relacionados

Referências

Última verificação em 13/07/2026 em relação à documentação oficial da AWS vinculada acima.

Trabalhe com o DynamoDB sem o Console

Um cliente desktop rápido para DynamoDB que roda o SQL de verdade que o DynamoDB não consegue — JOINs, GROUP BY, agregações — com edição visual e um agente de IA com suas próprias chaves do Bedrock.

Teste grátis de 30 dias, sem cartão de crédito — depois o plano Grátis sem limite de tempo.