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ãoSET profile = :p, profile.email = :e. O segundo caminho está dentro do primeiro.
  • O mesmo atributo aparece duas vezesSET updatedAt = :a REMOVE updatedAt, ou SET 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 define item.field (visto no Dynamoose com createdAt/updatedAt automáticos).
  • Atualizar uma list e um de seus elementos juntosSET mylist = :l, mylist[0] = :v.

Como corrigir

  1. 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'}}
  2. 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.

  3. De-duplique — certifique-se de que cada atributo aparece em exatamente uma ação entre SET/REMOVE/ADD/DELETE.

  4. 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.

  5. 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

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.