The document path provided in the update expression is invalid for update

TL;DR — Você está escrevendo em um caminho aninhado (SET parent.child = :v) mas parent não existe no item — ou existe como uma string/número em vez de um map ou list. O DynamoDB NÃO cria maps intermediários automaticamente. Crie o pai primeiro (SET #p = if_not_exists(#p, :emptyMap) em uma atualização anterior, ou inicialize {} quando o item é criado), depois defina o atributo aninhado.

O que significa

ValidationException: The document path provided in the update expression
is invalid for update

Uma update expression pode endereçar caminhos profundos (stats.daily.views, items[3].qty), mas cada passo do caminho exceto o último precisa já existir no item com um tipo compatível. Se o item não tem atributo stats — ou stats é uma string — não há onde pendurar daily, e a atualização é rejeitada. A mesma verificação roda dentro de transações, onde aparece como um reason de cancelamento ValidationError.

Por que acontece

  • O map pai ainda não existe — o item foi criado sem stats, e agora SET stats.daily = :v não tem stats no qual descer.
  • O pai existe com o tipo erradostats é uma string ou número, não um map (M), então não tem membros para endereçar.
  • Indexar em uma list ausenteSET items[0].qty = :q quando items não está no item ou não é uma list.
  • Um segmento de caminho com erro de digitaçãoSET stat.daily = :v (sem o s) desce em um atributo que não está lá.
  • Itens diferentes têm formas diferentes — a atualização funciona em itens que carregam o map e falha nos que não carregam (comum em single-table designs com entidades mistas).

Como corrigir

  1. Inicialize os maps pais quando você cria o item — escreva stats: {} (um M vazio) de antemão, e atualizações aninhadas sempre têm onde aterrissar.

  2. Ou crie o pai sob demanda, depois defina o filho — duas atualizações. O DynamoDB não deixa você fazer ambos em uma expressão (isso é uma sobreposição de caminho):

    // update 1 — create the map only if it's missing
    UpdateExpression: 'SET #s = if_not_exists(#s, :empty)',
    ExpressionAttributeNames: {'#s': 'stats'},
    ExpressionAttributeValues: {':empty': {}}
    
    // update 2 — now the nested set is safe
    UpdateExpression: 'SET #s.#d = :v',
    ExpressionAttributeNames: {'#s': 'stats', '#d': 'daily'}

    Note que if_not_exists(stats.daily, :v) não ajuda aqui — ele protege o valor, não o pai ausente.

  3. Substitua o map inteiro em vez disso quando você é dono de toda a sua forma: SET #s = :wholeMap funciona quer stats existisse ou não.

  4. Verifique a forma real do item — leia o item e confira que o atributo pai existe e é um M/L antes de supor que o caminho é válido.

O app desktop DynoTable mostra a estrutura aninhada real de cada item num relance — você pode ver se stats é um map, uma string ou está totalmente ausente antes de escrever nele.

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

O DynoTable é um cliente desktop rápido para o DynamoDB — navegue pelas tabelas, execute consultas no estilo SQL e edite itens localmente.