"Can Not Use Both Expression and Non-Expression Parameters": não é possível usar os dois
TL;DR — Sua solicitação definiu um parâmetro legado (KeyConditions, QueryFilter, ScanFilter, AttributesToGet, Expected, AttributeUpdates, ConditionalOperator) e sua expressão equivalente (KeyConditionExpression, FilterExpression, ProjectionExpression, ConditionExpression, UpdateExpression) na mesma chamada. DynamoDB proíbe misturar as duas famílias. Remova o parâmetro herdado e use apenas expressões.
O que significa
ValidationException: Can not use both expression and non-expression parameters in
the same request: Non-expression parameters: {KeyConditions} Expression
parameters: {KeyConditionExpression}
# what the engine actually returns, reproduced against DynamoDB Local:
ValidationException: Can not use both expression and non-expression parameters in the same request: Non-expression parameters: {KeyConditions} Expression parameters: {KeyConditionExpression}DynamoDB possui duas gerações de parâmetros. A família herdada (KeyConditions, QueryFilter, ScanFilter, AttributesToGet, Expected, AttributeUpdates, ConditionalOperator) é anterior às expressões; a família expression (KeyConditionExpression, FilterExpression, ProjectionExpression, ConditionExpression, UpdateExpression) o substituiu. Uma única solicitação deve ser comprometida com uma família - o guia do desenvolvedor é explícito que o DynamoDB "não permite misturar parâmetros condicionais herdados e parâmetros de expressão em uma única chamada", mesmo quando eles cobrem questões não relacionadas.
Por que isso acontece
- Código semimigrado — você adicionou
KeyConditionExpression, mas deixou umKeyConditionsantigo no mesmo objeto de parâmetros. - Uma colisão de projeção —
AttributesToGet(legado) ao lado deProjectionExpression. - Uma colisão de filtro —
ScanFilter/QueryFilterao lado deFilterExpression. - Uma colisão de gravação —
Expected/AttributeUpdatesjunto comConditionExpression/UpdateExpression. - Uma biblioteca auxiliar que injeta um padrão legado enquanto você define o formulário de expressão.
Como corrigir
- Exclua o parâmetro legado. Mantenha apenas o formato da expressão:
KeyConditionExpressionsobreKeyConditions,FilterExpressionsobreScanFilter/QueryFilter,ProjectionExpressionsobreAttributesToGet,ConditionExpression/UpdateExpressionsobreExpected/AttributeUpdates. - Mover valores para espaços reservados — os valores embutidos legados tornam-se
ExpressionAttributeValues(:v) e os nomes reservados /complex tornam-seExpressionAttributeNames(#n). - Auditoria de todo o objeto params — o conflito pode ser entre duas preocupações diferentes (por exemplo, projeção herdada + condição da chave de expressão), e não apenas a mesma.
- Prefira expressões em todos os lugares — AWS mantém os parâmetros legados apenas para compatibilidade com versões anteriores e recomenda os parâmetros de expressão para todos os novos códigos; padronizar expressões evita essa classe de erro.
- Retire os padrões herdados das bibliotecas auxiliares. Alguns wrappers do SDK ainda injetam
AttributesToGetouKeyConditions, a menos que você os desative explicitamente.
Execute no DynoTable
O painel de consulta do DynoTable usa apenas parâmetros de expressão – não existem campos legados KeyConditions ou ScanFilter nas solicitações geradas. Abra uma tabela com ⌘K, crie uma consulta ou varredura e copie o KeyConditionExpression emitido e os mapas de atributos em sua migração.
Use o Query Builder para criar o protótipo da solicitação somente de expressão antes de refatorar o código SDK antigo. A preparação (⌘S) permite testar a nova consulta em dados ativos sem confirmar escritas. Alternar perfis com ⌘P; configure-os em Configurações → Perfis com Conexão de teste. Consulte Conectar ao AWS e Instalar. Os parâmetros legados KeyConditions e ScanFilter não aparecem em nenhum lugar nas solicitações geradas pelo DynoTable. Se o wrapper do SDK ainda os injetar, registre o objeto de parâmetros completo e exclua todas as chaves herdadas antes que a chamada chegue ao DynamoDB.
Fontes
- Parâmetros condicionais DynamoDB legados (verificado em 13/07/2026)
- Consulta - Referência Amazon DynamoDB API (verificado em 13/07/2026)
Erros relacionados
- Não é possível especificar a projeção quando Select for COUNT — outra combinação de parâmetros mutuamente exclusiva.
- Condição da chave de consulta não suportada — um
KeyConditionExpressionmalformado. - Exemplo de código: Query in Node.js — uma consulta somente de expressão para a qual migrar.
- Aprenda: Expressões de condição chave · Nomes e valores de expressões
Referências
Parâmetros condicionais legados do DynamoDB — Guia do desenvolvedor do Amazon DynamoDB
Usando expressões no DynamoDB — Guia do desenvolvedor do Amazon DynamoDB
Última verificação em 13/07/2026 em relação à documentação oficial do AWS vinculada acima.