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: pkFilterExpression é 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 ValidationException — do lado do cliente e não pode ser repetida até que você reestruture.
Por que isso acontece
- Uma condição chave escrita como um filtro —
FilterExpression: 'sk = :v'ondeské a chave de classificação; ele pertence aoKeyConditionExpression. - Filtragem na chave do índice — quando você
Queryum 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
- 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' - 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.
- 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.
- 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.
- Audite as requisições geradas. Registre
KeyConditionExpressioneFilterExpressionjuntos — 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
- Query — Amazon DynamoDB API Reference (verificado em 13/07/2026)
- Filter expressions for Query (verificado em 13/07/2026)
Erros relacionados
- Query key condition not supported — um operador/forma inválido na própria condição de chave.
- Query condition missed key schema element — a consulta não forneceu a chave de partição.
- Exemplo de código: Query in Node.js — condição de chave e filtro divididos corretamente.
- Aprenda: Filtering strategies · Key condition expressions
Referências
- Query — Amazon DynamoDB API Reference
- Filter expressions for Query — Amazon DynamoDB Developer Guide
- Using Global Secondary Indexes in DynamoDB — Amazon DynamoDB Developer Guide
Última verificação em 13/07/2026 em relação à documentação oficial da AWS vinculada acima.