The provided expression refers to an attribute that does not exist in the item

TL;DR — Seu UpdateExpression lê um atributo que não está presente no item — um operando aritmético (SET score = score + :inc quando score nunca foi definido), uma cópia de outro atributo (SET a = b), ou um list_append cujo operando de list está ausente. Proteja a leitura com if_not_exists, ou semeie o atributo quando o item é criado. (Escrever em um caminho aninhado cujo map pai está ausente levanta o erro separado "document path invalid for update".)

O que significa

ValidationException: The provided expression refers to an attribute
that does not exist in the item

Este é um HTTP 400 ValidationException. A requisição fez o parse bem, mas quando o DynamoDB a avaliou contra o item, um atributo que sua expressão — um operando de +/-, a origem de uma cópia SET a = b, ou um argumento de list_append — não está lá, então o operando não consegue resolver. É do lado do cliente e não retentável: o mesmo item + expressão o reproduz.

Por que isso acontece

  • Aritmética sobre um atributo não definidoSET score = score + :inc lança quando score nunca foi inicializado; a sintaxe de incremento/decremento dos docs opera sobre um atributo numérico existente.
  • Copiar de um atributo ausenteSET backupEmail = email quando o item não tem email.
  • list_append sobre uma list ausenteSET tags = list_append(tags, :more) quando tags ainda não existe.
  • Mapeamento de placeholder errado para um caminho aninhado — mapear todo o caminho pontilhado em uma entrada ExpressionAttributeNames ("#p": "stats.viewCount") em vez de substituir apenas a folha; o DynamoDB trata o literal "stats.viewCount" como um único nome de atributo, que está ausente no momento em que a expressão o lê.
  • Um erro de digitação ou maiúsculas erradas em um nome de atributo lido — nomes de atributo do DynamoDB são sensíveis a maiúsculas.

Como corrigir

  1. Proteja a leitura com if_not_exists para que a primeira escrita funcione mesmo quando o atributo ainda não está lá:
    SET score = if_not_exists(score, :zero) + :inc
    SET tags = list_append(if_not_exists(tags, :emptyList), :more)
  2. Semeie o atributo quando o item é criado — escreva score: 0, tags: [] de antemão para que leituras posteriores sempre resolvam.
  3. Substitua apenas a folha em um caminho aninhado — mantenha os pontos literais na expressão: SET stats.#c = :v com {"#c": "viewCount"}, não o caminho inteiro em um nome.
  4. Verifique se o atributo existe / grafia + maiúsculas com um GetItem antes de supor que o caminho é válido.
  5. Escrevendo um filho aninhado cujo map pai está ausente? Esse é o erro irmão — veja the document path provided in the update expression is invalid for update para o padrão de dois passos de criar-o-pai.

Quer a forma real do item na sua frente enquanto escreve a atualização? O app desktop DynoTable mostra todo atributo (incluindo maps e lists aninhados) para que um caminho pai ausente fique óbvio num relance.

Erros relacionados

Referências

Verificado pela última vez em 2026-07-13 contra a 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.