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: 1 validation error detected: 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 isso 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.

Reproduza

Um único UpdateExpression definindo tanto um map quanto um campo dentro desse mesmo map:

await client.send(
  new UpdateItemCommand({
    TableName: 'orders',
    Key: {pk: {S: 'ORDER#1'}, sk: {S: 'META'}},
    UpdateExpression: 'SET #a = :v, #a.#b = :w',
    ExpressionAttributeNames: {'#a': 'addr', '#b': 'city'},
    ExpressionAttributeValues: {':v': {M: {}}, ':w': {S: 'Berlin'}}
  })
);

Saída real:

ValidationException: 1 validation error detected: Invalid UpdateExpression: Two document paths overlap with each other; must remove or rewrite one of these paths; path one: [addr], path two: [addr, city]
HTTP 400

A mensagem imprime os dois caminhos em conflito por completo, então ela diz exatamente qual par reconciliar. A ordem seria indefinida se ambos fossem aplicados, e é por isso que o DynamoDB recusa em vez de escolher um.

Erros relacionados

Referências

Verificado pela última vez em 2026-07-13 contra a documentação oficial da AWS vinculada acima.

Reproduzido em 2026-07-26 no DynamoDB Local 2.x com o AWS SDK for JavaScript v3.1095.0 — a saída acima é literal.

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.