Two document paths overlap with each other
요약 — 하나의 UpdateExpression은 각 문서 경로를 한 번만 건드릴 수 있고, 같은 표현식이 건드리는 다른 경로 안에 놓인 경로가 있어서도 안 됩니다. SET profile = :p, profile.email = :e는 중첩됩니다(profile.email이 profile 안에 있습니다). 같은 속성을 두 번 지목하는 것도 마찬가지입니다. 자식을 부모 값 안으로 접어 넣거나, 두 번의 업데이트로 나누세요.
무엇을 의미하는가
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는 UpdateExpression의 모든 액션을 업데이트 이전 상태의 항목 속성 값에 대해 평가합니다 — 액션이 왼쪽에서 오른쪽으로 차례차례 적용되는 것이 아닙니다. 두 액션이 겹치는 경로(같은 속성, 또는 부모와 그 안에 중첩된 무언가)를 대상으로 하면 결과가 모호해집니다. profile.email = :e는 profile = :p가 맵 전체를 교체하기 전에 실행될까요, 후에 실행될까요? DynamoDB는 추측하는 대신 표현식을 즉시 거부합니다. (같은 중첩 검사는 ProjectionExpression의 중복 경로에도 적용됩니다.)
왜 발생하는가
- 하나의 표현식에서 부모와 자식을 함께 설정 —
SET profile = :p, profile.email = :e. 두 번째 경로가 첫 번째 안에 있습니다. - 같은 속성이 두 번 등장 —
SET updatedAt = :a REMOVE updatedAt, 또는SET tags = :t ADD tags :more. - ODM/래퍼가 여러분이 설정하는 경로를 조용히 추가 — 전형적인 경우로, 라이브러리가 타임스탬프나 객체 전체(
SET item = :obj)를 자동으로 쓰는 동시에 여러분의 코드도item.field를 설정하는 상황입니다(Dynamoose의 자동createdAt/updatedAt에서 흔히 보입니다). - 리스트와 그 요소를 함께 업데이트 —
SET mylist = :l, mylist[0] = :v.
어떻게 해결하는가
자식을 부모 값 안으로 접어 넣으세요 — 어차피 맵을 교체할 것이라면 새 이메일을 그 안에 넣고 두 번째 액션을 없애세요:
// instead of SET profile = :p, profile.email = :e UpdateExpression: 'SET #p = :p', ExpressionAttributeValues: {':p': {name: 'Ada', email: 'ada@example.com'}}또는 리프만 업데이트하세요 — 부모는 그대로 두고 중첩 필드를 개별적으로 설정하세요(
SET #p.#n = :n, #p.#e = :e). 같은 부모 아래의 형제 경로는 겹치지 않습니다. 겹치는 것은 중첩뿐입니다.중복을 제거하세요 —
SET/REMOVE/ADD/DELETE전반에서 각 속성이 정확히 하나의 액션에만 나타나도록 하세요.라이브러리의 자동 필드를 확인하세요 — 여러분의 표현식이 이미 쓰고 있는 자동 관리 속성(타임스탬프, 버전)은 업데이트에서 끄거나 제외하세요.
정말로 "부모를 교체한 다음 자식을 손보기" 의미가 필요하다면 두 요청으로 나누세요 — 순서대로 두 번의
UpdateItem호출입니다.
중첩된 맵을 손으로 편집할 때 중첩이 슬며시 끼어듭니다 — DynoTable 데스크톱 앱은 항목의 속성을 제자리에서 편집하고, 실제로 바뀐 것에 대해서만 깔끔하고 겹치지 않는 업데이트를 보냅니다.
재현하기
하나의 UpdateExpression이 맵과 그 맵 안의 필드를 함께 설정하는 경우:
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'}}
})
);실제 출력:
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메시지가 충돌하는 두 경로를 모두 온전히 출력해 주므로, 어떤 쌍을 조정해야 하는지 정확히 알려 줍니다. 둘 다 적용된다면 순서가 정의되지 않으며, 그래서 DynamoDB는 하나를 고르는 대신 거부합니다.
관련 오류
- The document path provided is invalid for update — 또 다른 중첩 경로 업데이트 실패(이중으로 쓰는 대신 부모가 없는 경우).
- Invalid UpdateExpression: 구문 오류
- 학습: 업데이트 표현식
참고 자료
- 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
위에 링크된 공식 AWS 문서를 기준으로 2026-07-13에 마지막으로 검증했습니다.
2026-07-26에 DynamoDB Local 2.x와 AWS SDK for JavaScript v3.1095.0으로 재현했습니다 — 위 출력은 그대로 옮긴 것입니다.