업데이트 표현식 - Amazon DynamoDB

업데이트 표현식

UpdateItem 작업은 기존 항목을 업데이트하거나 기존 항목이 없는 경우 새 항목을 테이블에 추가합니다. 업데이트할 항목의 키를 제공해야 합니다. 또한 수정할 속성과 그러한 속성에 할당할 값을 지정하는 업데이트 표현식도 제공해야 합니다.

업데이트 표현식UpdateItem이 항목의 속성을 수정하는 방법을 지정합니다(예: 스칼라 값 설정 또는 목록이나 맵에서 요소 제거).

다음은 업데이트 표현식에 대한 구문을 요약한 것입니다.

update-expression ::= [ SET action [, action] ... ] [ REMOVE action [, action] ...] [ ADD action [, action] ... ] [ DELETE action [, action] ...]

업데이트 표현식은 하나 이상의 절로 구성됩니다. 각 절은 SET, REMOVE, ADD 또는 DELETE 키워드로 시작됩니다. 이러한 절은 업데이트 표현식에 어떤 순서로든 포함할 수 있습니다. 하지만 각 작업 키워드는 한 번만 표시할 수 있습니다.

각 절 내에는 하나 이상의 작업이 쉼표로 구분되어 있습니다. 각 작업은 데이터 수정을 나타냅니다.

이 단원의 예제는 프로젝션 표현식ProductCatalog 항목을 기반으로 합니다.

아래 주제에서는 SET 작업의 다양한 사용 사례를 다룹니다.

SET - 항목 속성 수정 또는 추가

업데이트 표현식에서 SET 작업을 사용하여 하나 이상의 속성을 항목에 추가합니다. 이러한 속성 중 하나가 이미 존재하는 경우에는 새 값이 해당 값을 덮어씁니다.

SET을 사용하여 Number 형식의 속성에서 더하거나 뺄 수도 있습니다. 여러 SET 작업을 수행하려면 각 작업을 쉼표로 구분합니다.

다음 구문 요약에서:

  • path 요소는 항목의 문서 경로입니다.

  • 피연산자 요소는 항목의 문서 경로 또는 함수일 수 있습니다.

set-action ::= path = value value ::= operand | operand '+' operand | operand '-' operand operand ::= path | function

다음 PutItem 작업은 예제에서 참조할 샘플 항목을 생성합니다.

aws dynamodb put-item \ --table-name ProductCatalog \ --item file://item.json

--item의 인수는 item.json 파일에 저장됩니다. 간소화를 위해 항목 속성 몇 개만 사용됩니다.

{ "Id": {"N": "789"}, "ProductCategory": {"S": "Home Improvement"}, "Price": {"N": "52"}, "InStock": {"BOOL": true}, "Brand": {"S": "Acme"} }

속성 수정

ProductCategoryPrice 속성을 업데이트합니다.

aws dynamodb update-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"789"}}' \ --update-expression "SET ProductCategory = :c, Price = :p" \ --expression-attribute-values file://values.json \ --return-values ALL_NEW

--expression-attribute-values의 인수는 values.json 파일에 저장됩니다.

{ ":c": { "S": "Hardware" }, ":p": { "N": "60" } }
참고

UpdateItem 작업에서 --return-values ALL_NEW를 실행하면 DynamoDB에서 업데이트 후 나타나는 항목을 반환합니다.

목록 및 맵 추가

새 목록과 새 맵을 추가합니다.

aws dynamodb update-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"789"}}' \ --update-expression "SET RelatedItems = :ri, ProductReviews = :pr" \ --expression-attribute-values file://values.json \ --return-values ALL_NEW

--expression-attribute-values의 인수는 values.json 파일에 저장됩니다.

{ ":ri": { "L": [ { "S": "Hammer" } ] }, ":pr": { "M": { "FiveStar": { "L": [ { "S": "Best product ever!" } ] } } } }

목록에 요소 추가

새로운 속성을 RelatedItems 목록에 추가합니다. 목록 요소는 0부터 시작되므로 [0]은 목록의 첫 번째 요소를 나타내고 [1]은 두 번째 요소를 나타냅니다.

aws dynamodb update-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"789"}}' \ --update-expression "SET RelatedItems[1] = :ri" \ --expression-attribute-values file://values.json \ --return-values ALL_NEW

--expression-attribute-values의 인수는 values.json 파일에 저장됩니다.

{ ":ri": { "S": "Nails" } }
참고

SET을 사용하여 목록 요소를 업데이트하는 경우 해당 요소의 내용이 사용자가 지정한 새 데이터로 바뀝니다. 요소가 아직 없으면 SET은 목록의 끝에 새 요소를 추가합니다.

단일 SET 작업에서 여러 요소를 추가하는 경우 요소가 요소 번호에 따라 순서대로 정렬됩니다.

중첩 맵 속성 추가

일부 중첩 맵 속성을 추가합니다.

aws dynamodb update-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"789"}}' \ --update-expression "SET #pr.#5star[1] = :r5, #pr.#3star = :r3" \ --expression-attribute-names file://names.json \ --expression-attribute-values file://values.json \ --return-values ALL_NEW

--expression-attribute-names의 인수는 names.json 파일에 저장됩니다.

{ "#pr": "ProductReviews", "#5star": "FiveStar", "#3star": "ThreeStar" }

--expression-attribute-values의 인수는 values.json 파일에 저장됩니다.

{ ":r5": { "S": "Very happy with my purchase" }, ":r3": { "L": [ { "S": "Just OK - not that great" } ] } }

수치 속성 증가 및 감소

기존 수치 속성에 더하거나 뺄 수 있습니다. 이 작업을 수행하려면 +(더하기) 및 -(빼기) 연산자를 사용합니다.

항목의 Price을 줄입니다.

aws dynamodb update-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"789"}}' \ --update-expression "SET Price = Price - :p" \ --expression-attribute-values '{":p": {"N":"15"}}' \ --return-values ALL_NEW

Price을 증가시키려면 업데이트 표현식에서 + 연산자를 사용합니다.

목록에 요소 추가

목록 끝에 요소를 추가할 수 있습니다. 이렇게 하려면 list_append 함수와 함께 SET를 사용합니다. (파일 이름은 대/소문자를 구분합니다.) list_append 함수는 SET 작업에 고유하며 업데이트 표현식에서만 사용할 수 있습니다. 구문은 다음과 같습니다.

  • list_append (list1, list2)

이 함수는 입력으로 두 개의 목록을 가져오고 list2의 모든 요소를 list1에 추가합니다.

목록에 요소 추가에서는 RelatedItems 목록을 생성하고 목록을 HammerNails라는 두 개의 요소로 채웠습니다. 이제 RelatedItems의 끝에 두 개의 요소를 더 추가합니다.

aws dynamodb update-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"789"}}' \ --update-expression "SET #ri = list_append(#ri, :vals)" \ --expression-attribute-names '{"#ri": "RelatedItems"}' \ --expression-attribute-values file://values.json \ --return-values ALL_NEW

--expression-attribute-values의 인수는 values.json 파일에 저장됩니다.

{ ":vals": { "L": [ { "S": "Screwdriver" }, {"S": "Hacksaw" } ] } }

마지막으로 RelatedItems시작에 요소 하나를 더 추가합니다. 이렇게 하려면 list_append 요소의 순서를 스왑합니다. (list_append는 두 개의 목록을 입력으로 가져오고 두 번째 목록을 첫 번째 목록에 추가한다는 점을 기억하십시오.)

aws dynamodb update-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"789"}}' \ --update-expression "SET #ri = list_append(:vals, #ri)" \ --expression-attribute-names '{"#ri": "RelatedItems"}' \ --expression-attribute-values '{":vals": {"L": [ { "S": "Chisel" }]}}' \ --return-values ALL_NEW

이제 결과적으로 생성되는 RelatedItems 속성에는 5개의 요소가 Chisel, Hammer, Nails, Screwdriver, Hacksaw 순서로 포함됩니다.

기존 속성의 덮어쓰기 방지

기존 속성의 덮어쓰기를 방지하려는 경우 if_not_exists 함수와 함께 SET를 사용할 수 있습니다. (파일 이름은 대/소문자를 구분합니다.) if_not_exists 함수는 SET 작업에 고유하며 업데이트 표현식에서만 사용할 수 있습니다. 구문은 다음과 같습니다.

  • if_not_exists (path, value)

항목의 지정된 path에 속성이 포함되지 않으면 if_not_existsvalue로 평가되고, 그렇지 않으면 path로 평가됩니다.

항목에 Price 속성이 아직 없는 경우에만 항목의 Price를 설정합니다. (Price가 이미 있는 경우 아무 동작도 발생하지 않습니다.)

aws dynamodb update-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"789"}}' \ --update-expression "SET Price = if_not_exists(Price, :p)" \ --expression-attribute-values '{":p": {"N": "100"}}' \ --return-values ALL_NEW

REMOVE - 항목에서 속성 삭제

업데이트 표현식에서 REMOVE 작업을 사용하여 Amazon DynamoDB에서 하나 이상의 속성을 항목에서 제거합니다. 여러 REMOVE 작업을 수행하려면 각 작업을 쉼표로 구분합니다.

다음은 업데이트 식의 REMOVE에 대한 구문을 요약한 것입니다. 제거하려는 속성의 문서 경로가 유일한 피연산자입니다.

remove-action ::= path

항목에서 일부 속성을 제거합니다. (이 속성이 없는 경우 아무 동작도 발생하지 않습니다.)

aws dynamodb update-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"789"}}' \ --update-expression "REMOVE Brand, InStock, QuantityOnHand" \ --return-values ALL_NEW

목록에서 요소 제거

REMOVE를 사용하여 목록에서 개별 요소를 삭제합니다.

목록에 요소 추가에서 다음 5개의 요소가 포함되도록 목록 속성(RelatedItems)을 수정합니다.

  • [0]Chisel

  • [1]Hammer

  • [2]Nails

  • [3]Screwdriver

  • [4]Hacksaw

다음 AWS Command Line Interface(AWS CLI) 예제에서는 목록에서 HammerNails를 삭제합니다.

aws dynamodb update-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"789"}}' \ --update-expression "REMOVE RelatedItems[1], RelatedItems[2]" \ --return-values ALL_NEW

HammerNails를 제거한 후에는 나머지 요소가 이동됩니다. 이제 목록에는 다음이 포함됩니다.

  • [0]Chisel

  • [1]Screwdriver

  • [2]Hacksaw

ADD - 숫자 및 세트 업데이트

참고

일반적으로 ADD 보다는 SET을 사용할 것을 권장합니다.

업데이트 표현식에서 ADD 작업을 사용하여 새로운 속성과 값을 항목에 추가합니다.

속성이 이미 있으면 ADD의 동작은 속성의 데이터 형식에 따라 달라집니다.

  • 속성이 숫자이고 추가하려는 값도 숫자이면 값이 산술적으로 기존 속성에 더해집니다. (값이 음수이면 기존 속성에서 차감됩니다.)

  • 속성이 집합이고 추가하려는 값도 집합이면 값이 기존 집합에 추가됩니다.

참고

ADD 작업은 숫자 및 집합 데이터 형식만 지원합니다.

여러 ADD 작업을 수행하려면 각 작업을 쉼표로 구분합니다.

다음 구문 요약에서:

  • path 요소는 속성에 대한 문서 경로입니다. 속성은 Number 또는 집합 데이터 형식이어야 합니다.

  •  요소는 속성에 더할 숫자(Number 데이터 형식의 경우) 또는 속성에 추가할 세트(집합 형식의 경우)입니다.

add-action ::= path value

아래 주제에서는 ADD 작업의 다양한 사용 사례를 다룹니다.

숫자 추가

QuantityOnHand 속성이 존재하지 않는다고 가정합니다. 다음 AWS CLI 예제에서는 QuantityOnHand을 5로 설정합니다.

aws dynamodb update-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"789"}}' \ --update-expression "ADD QuantityOnHand :q" \ --expression-attribute-values '{":q": {"N": "5"}}' \ --return-values ALL_NEW

이제 QuantityOnHand가 존재하므로 예제를 다시 실행하여 QuantityOnHand를 매번 5씩 증가시킬 수 있습니다.

세트에 요소 추가

Color 속성이 존재하지 않는다고 가정합니다. 다음 AWS CLI 예제는 두 요소가 있는 문자열 집합으로 Color을 설정합니다.

aws dynamodb update-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"789"}}' \ --update-expression "ADD Color :c" \ --expression-attribute-values '{":c": {"SS":["Orange", "Purple"]}}' \ --return-values ALL_NEW

이제 Color가 존재하므로 여기에 요소를 더 추가할 수 있습니다.

aws dynamodb update-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"789"}}' \ --update-expression "ADD Color :c" \ --expression-attribute-values '{":c": {"SS":["Yellow", "Green", "Blue"]}}' \ --return-values ALL_NEW

DELETE - 세트에서 요소 제거

중요

DELETE 작업은 Set 데이터 형식만 지원합니다.

업데이트 표현식에서 DELETE 작업을 사용하여 집합에서 하나 이상의 요소를 제거합니다. 여러 DELETE 작업을 수행하려면 각 작업을 쉼표로 구분합니다.

다음 구문 요약에서:

  • path 요소는 속성에 대한 문서 경로입니다. 속성은 설정된 Set 데이터 형식이어야 합니다.

  • 하위 집합경로에서 삭제하려는 하나 이상의 요소입니다. 하위 집합을 집합 형식으로 지정해야 합니다.

delete-action ::= path subset

세트에 요소 추가에서 Color 문자열 집합을 생성합니다. 이 예제에서는 해당 집합에서 일부 요소를 제거합니다.

aws dynamodb update-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"789"}}' \ --update-expression "DELETE Color :p" \ --expression-attribute-values '{":p": {"SS": ["Yellow", "Purple"]}}' \ --return-values ALL_NEW

여러 업데이트 표현식 사용

단일 명령에 여러 업데이트 표현식을 사용할 수 있습니다.

속성 값을 수정하고 다른 속성을 완전히 제거하려면 단일 명령문에서 SET 및 REMOVE 작업을 사용할 수 있습니다. 이 작업을 수행하면 Price 값이 15로 감소되고 항목에서 InStock 속성이 제거됩니다.

aws dynamodb update-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"789"}}' \ --update-expression "SET Price = Price - :p REMOVE InStock" \ --expression-attribute-values '{":p": {"N":"15"}}' \ --return-values ALL_NEW

목록에 추가하고 다른 속성의 값도 변경하려면 단일 명령문에 두 개의 SET 작업을 사용할 수 있습니다. 이 작업을 수행하면 RelatedItems 목록 속성에 'Nails'가 추가되고 Price 값도 21로 설정됩니다.

aws dynamodb update-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"789"}}' \ --update-expression "SET RelatedItems[1] = :newValue, Price = :newPrice" \ --expression-attribute-values '{":newValue": {"S":"Nails"}, ":newPrice": {"N":"21"}}' \ --return-values ALL_NEW