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 updateUma 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 agoraSET stats.daily = :vnão temstatsno qual descer. - O pai existe com o tipo errado —
statsé uma string ou número, não um map (M), então não tem membros para endereçar. - Indexar em uma list ausente —
SET items[0].qty = :qquandoitemsnão está no item ou não é uma list. - Um segmento de caminho com erro de digitação —
SET stat.daily = :v(sem os) 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
Inicialize os maps pais quando você cria o item — escreva
stats: {}(umMvazio) de antemão, e atualizações aninhadas sempre têm onde aterrissar.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.Substitua o map inteiro em vez disso quando você é dono de toda a sua forma:
SET #s = :wholeMapfunciona querstatsexistisse ou não.Verifique a forma real do item — leia o item e confira que o atributo pai existe e é um
M/Lantes 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
- Two document paths overlap with each other — por que "criar pai + definir filho" não pode ser uma expressão.
- The provided expression refers to an attribute that does not exist
- Invalid UpdateExpression: Syntax error
- Aprenda: Update expressions · Data types
Referências
- Using update expressions in DynamoDB — Amazon DynamoDB Developer Guide
- TransactWriteItems — Amazon DynamoDB API Reference
- Expression attribute names (aliases) in DynamoDB — Amazon DynamoDB Developer Guide
Verificado pela última vez em 2026-07-13 contra a documentação oficial da AWS vinculada acima.