Two document paths overlap with each other
TL;DR — Um UpdateExpression só pode tocar cada document path uma vez, e nenhum caminho pode ficar dentro de outro caminho que a mesma expressão também toca. SET profile = :p, profile.email = :e se sobrepõe (profile.email vive dentro de profile); nomear o mesmo atributo duas vezes também. Dobre o filho no valor do pai, ou divida em duas atualizações.
O que significa
ValidationException: Invalid UpdateExpression: Two document paths overlap
with each other; must remove or rewrite one of these paths;
path one: [profile], path two: [profile, email]O DynamoDB avalia toda ação em um UpdateExpression contra os valores de atributo do item como eles estavam antes da atualização — as ações não são aplicadas uma após a outra da esquerda para a direita. Se duas ações miram caminhos sobrepostos (o mesmo atributo, ou um pai e algo aninhado dentro dele), o resultado seria ambíguo: profile.email = :e roda antes ou depois de profile = :p substituir o map inteiro? Em vez de adivinhar, o DynamoDB rejeita a expressão de imediato. (A mesma verificação de sobreposição se aplica a caminhos duplicados em um ProjectionExpression.)
Por que acontece
- Definir um pai e seu filho em uma expressão —
SET profile = :p, profile.email = :e. O segundo caminho está dentro do primeiro. - O mesmo atributo aparece duas vezes —
SET updatedAt = :a REMOVE updatedAt, ouSET tags = :t ADD tags :more. - Um ODM/wrapper adiciona silenciosamente um caminho que você também define — o caso clássico: uma biblioteca escreve automaticamente um timestamp ou o objeto inteiro (
SET item = :obj) enquanto seu código também defineitem.field(visto no Dynamoose comcreatedAt/updatedAtautomáticos). - Atualizar uma list e um de seus elementos juntos —
SET mylist = :l, mylist[0] = :v.
Como corrigir
Dobre o filho no valor do pai — se você está substituindo o map de qualquer forma, ponha o novo email dentro dele e remova a segunda ação:
// instead of SET profile = :p, profile.email = :e UpdateExpression: 'SET #p = :p', ExpressionAttributeValues: {':p': {name: 'Ada', email: 'ada@example.com'}}Ou atualize apenas as folhas — mantenha o pai intocado e defina os campos aninhados individualmente (
SET #p.#n = :n, #p.#e = :e). Caminhos irmãos sob o mesmo pai não se sobrepõem; apenas o aninhamento se sobrepõe.De-duplique — certifique-se de que cada atributo aparece em exatamente uma ação entre
SET/REMOVE/ADD/DELETE.Verifique os auto-campos da sua biblioteca — desabilite ou exclua atributos auto-gerenciados (timestamps, versões) das atualizações onde sua própria expressão já os escreve.
Divida em duas requisições quando você genuinamente precisa da semântica "substituir pai, depois ajustar filho" — duas chamadas
UpdateItem, em ordem.
Editar maps aninhados à mão é onde as sobreposições se infiltram — o app desktop DynoTable edita os atributos de um item no lugar e emite uma atualização limpa e sem sobreposição para exatamente o que mudou.
Erros relacionados
- The document path provided is invalid for update — a outra falha de atualização de caminho aninhado (pai ausente em vez de duplamente escrito).
- Invalid UpdateExpression: Syntax error
- Aprenda: Update expressions
Referências
- Using update expressions in DynamoDB — Amazon DynamoDB Developer Guide
- Referring to item attributes when using expressions in DynamoDB — Amazon DynamoDB Developer Guide
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
Verificado pela última vez em 2026-07-13 contra a documentação oficial da AWS vinculada acima.