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: 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ón —
SET profile = :p, profile.email = :e. La segunda ruta está dentro de la primera. - El mismo atributo aparece dos veces —
SET updatedAt = :a REMOVE updatedAt, oSET 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 estableceitem.field(visto en Dynamoose concreatedAt/updatedAtautomáticos). - Actualizar una lista y uno de sus elementos juntos —
SET mylist = :l, mylist[0] = :v.
Cómo solucionarlo
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'}}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.Deduplica — asegúrate de que cada atributo aparezca en exactamente una acción a lo largo de
SET/REMOVE/ADD/DELETE.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.
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ó.
Errores relacionados
- The document path provided is invalid for update — el otro fallo de actualización de ruta anidada (padre ausente en lugar de escrito por partida doble).
- Invalid UpdateExpression: Syntax error
- Aprende: Update expressions
References
- 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
Última verificación el 2026-07-13 con la documentación oficial de AWS enlazada arriba.