Two document paths overlap with each other

TL;DR — Un UpdateExpression puede tocar cada ruta de documento solo una vez, y ninguna ruta puede estar dentro de otra ruta que la misma expresión también toque. SET profile = :p, profile.email = :e se solapa (profile.email vive dentro de profile); nombrar el mismo atributo dos veces también. Incorpora el hijo al valor del padre, o divide en dos actualizaciones.

Qué 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]

DynamoDB evalúa cada acción de un UpdateExpression contra los valores de atributo del Item tal como estaban antes de la actualización — las acciones no se aplican una tras otra de izquierda a derecha. Si dos acciones apuntan a rutas solapadas (el mismo atributo, o un padre y algo anidado dentro de él), el resultado sería ambiguo: ¿se ejecuta profile.email = :e antes o después de que profile = :p reemplace todo el mapa? En lugar de adivinar, DynamoDB rechaza la expresión de plano. (La misma comprobación de solapamiento se aplica a las rutas duplicadas en un ProjectionExpression.)

Por qué ocurre

  • Establecer un padre y su hijo en una expresiónSET profile = :p, profile.email = :e. La segunda ruta está dentro de la primera.
  • El mismo atributo aparece dos vecesSET updatedAt = :a REMOVE updatedAt, o SET tags = :t ADD tags :more.
  • Un ODM/wrapper añade silenciosamente una ruta que tú también estableces — el caso clásico: una librería auto-escribe una marca de tiempo o el objeto entero (SET item = :obj) mientras tu código también establece item.field (visto en Dynamoose con createdAt/updatedAt automáticos).
  • Actualizar una lista y uno de sus elementos juntosSET mylist = :l, mylist[0] = :v.

Cómo solucionarlo

  1. Incorpora el hijo al valor del padre — si vas a reemplazar el mapa de todos modos, pon el nuevo email dentro de él y elimina la segunda acción:

    // instead of SET profile = :p, profile.email = :e
    UpdateExpression: 'SET #p = :p',
    ExpressionAttributeValues: {':p': {name: 'Ada', email: 'ada@example.com'}}
  2. O actualiza solo las hojas — deja el padre intacto y establece los campos anidados individualmente (SET #p.#n = :n, #p.#e = :e). Las rutas hermanas bajo el mismo padre no se solapan; solo el anidamiento lo hace.

  3. Deduplica — asegúrate de que cada atributo aparezca en exactamente una acción a lo largo de SET/REMOVE/ADD/DELETE.

  4. Comprueba los campos automáticos de tu librería — deshabilita o excluye los atributos autogestionados (marcas de tiempo, versiones) de las actualizaciones donde tu propia expresión ya los escribe.

  5. Divide en dos peticiones cuando realmente necesites la semántica de "reemplazar el padre, luego ajustar el hijo" — dos llamadas UpdateItem, en orden.

Editar mapas anidados a mano es donde se cuelan los solapamientos — la aplicación de escritorio DynoTable edita los atributos de un Item in situ y emite una actualización limpia, sin solapamientos, exactamente para lo que cambió.

Reproducirlo

Una única UpdateExpression que establece a la vez un mapa y un campo dentro de ese mismo mapa:

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'}}
  })
);

Salida 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

El mensaje imprime al completo las dos rutas en conflicto, así que te dice exactamente qué par reconciliar. El orden sería indefinido si se aplicaran ambas, y por eso DynamoDB se niega en lugar de elegir una.

Errores relacionados

Referencias

Verificado por última vez el 2026-07-13 contra la documentación oficial de AWS enlazada arriba.

Reproducido el 2026-07-26 contra DynamoDB Local 2.x con AWS SDK for JavaScript v3.1095.0 — la salida de arriba es literal.

Trabaja con DynamoDB sin la Consola

Un cliente de escritorio rápido para DynamoDB que ejecuta el SQL real que DynamoDB no puede — JOINs, GROUP BY, agregaciones — con edición visual y un agente de IA con tus propias claves de Bedrock.

Prueba gratuita de 30 días, sin tarjeta — después, el plan Free sin límite de tiempo.