중급4분 분량

DynamoDB 업데이트 표현식: SET, REMOVE, ADD, DELETE(예제 포함)

업데이트 표현식은 UpdateItem에 단일 항목을 변경하는 방법을 알려줍니다. 쓰기, 증가, 삭제 또는 세트로 접기. 다중 행이 없습니다. UPDATE … SET … WHERE — 단일 항목의 이름을 전체 키로 지정하고 설명합니다. 4개의 절 키워드로 변경하세요.

DynamoDB 업데이트 표현식은 어떻게 작동합니까?

DynamoDB 업데이트 표현식은 4개의 절을 사용하여 하나의 항목을 변경하는 방법을 UpdateItem에 알려줍니다. SET을 쓰거나 덮어씁니다. ADD는 숫자나 합집합을 원자 단위로 증가시켜 집합으로 만듭니다. REMOVE는 속성 하나 또는 목록 요소 하나를 삭제합니다. DELETE은 집합에서 특정 구성원을 제거합니다. 한 번의 통화로 네 가지를 동시에 전달할 수 있습니다.

  • SET 속성(스칼라, 문서 및 함수 관용어 if_not_existslist_append.
  • ADD는 한 번의 왕복으로 원자 번호 증가 또는 집합 결합을 수행합니다. 읽기 우선이 없습니다.
  • REMOVE 속성을 완전히 삭제합니다(또는 인덱스별로 단일 목록 요소).
  • DELETE는 집합에서 특정 구성원을 제거하며 집합에서만 제거합니다.

SQL에서 나오는 트랩은 모든 것에 대해 SET에 도달합니다. ADDDELETE는 카운터나 세트에 대한 읽기-수정-쓰기가 경쟁이기 때문에 존재합니다. 동시성에서는 손실됩니다.

변경하려는 항목에 따라 조항을 선택하세요.

한 번의 UpdateItem 호출은 순서에 상관없이 4개의 절을 동시에 모두 전달할 수 있습니다. 각각 키워드는 최대 한 번만 나타나며 쉼표로 구분된 작업 목록을 취합니다.

조항작업그것을 사용하려면
SET모든 속성값 또는 문서 필드 쓰기/덮어쓰기
ADD숫자 또는 세트만원자적으로 증가하거나 세트로 통합
REMOVE모든 속성 또는 목록 요소속성을 삭제합니다. 하나의 목록 인덱스 삭제
DELETE세트만세트에서 특정 멤버 제거

문자열의 ADD 및 스칼라의 DELETE는 무작동(no-ops)이 아닌 검증 오류입니다. DynamoDB는 전체 호출을 거부합니다. 당 AWS update-expression reference, ADD은 숫자와 집합으로 제한되고, DELETE는 집합으로 제한됩니다.

작업한 예: 장바구니

카트당 품목 1개(키는 CartPK = "CART#c-9f21"CartSK = "SUMMARY"). 이는 실행 중인 OrderTotal, LineItems 목록, PromoCodes 문자열 세트, 그리고 ItemCount.

SET — 스칼라 및 문서 작성

SET은 거기에 있던 모든 것을 덮어씁니다. 목록에 광고 항목을 추가하고 동일한 통화의 총계:

SET OrderTotal = :total,
LineItems = list_append(LineItems, :newItem),
UpdatedAt = :now

list_append(LineItems, :newItem)은 꼬리에 추가됩니다. 논쟁을 뒤집다 - list_append(:newItem, LineItems) — 앞에 추가합니다. 인수의 순서는 다음과 같습니다. 연결 순서, 그 이상은 없습니다.

첫 번째 호출에는 풋건이 있습니다. 카트가 새 제품인 경우 LineItems 아직 존재하지 않으며 누락된 속성에 대한 list_append이 실패합니다. 그것을 지켜라 if_not_exists:

SET LineItems = list_append(if_not_exists(LineItems, :empty), :newItem)

if_not_exists(LineItems, :empty)은 현재 목록이 있으면 반환하고, 그렇지 않으면 대체 :empty(빈 목록 []). 그러면 첫 번째 추가가 이루어지고 나중에 추가됩니다. add는 동일한 표현을 사용합니다. 이것이 이러한 관용구가 존재하는 실제 이유입니다.

ADD — 원자적으로 개수를 증가시킵니다.

ItemCount을 범하려면 읽지 말고 코드에 하나를 추가한 다음 다시 SET하세요. 그것은 업데이트 손실 경쟁입니다. 두 개의 동시 추가는 모두 3를 읽고, 둘 다 4를 쓰고, 당신은 하나를 떨어 뜨 렸습니다. ADD은 서버 측에서 다음을 수행합니다.

ADD ItemCount :one

:one=1이면 이것은 원자 계수기입니다. 동시 호출은 다음에서 직렬화됩니다. 항목이므로 2개는 토지를 +2로 추가합니다. 감소에는 음수를 전달합니다. 만약에 ItemCount이 없으면 ADD는 이를 먼저 0로 처리하므로 시드할 필요가 없습니다. 카운터.

us-east-1의 온디맨드 시, 각 ADD에는 이후 항목의 1 WCU/KB가 청구됩니다. 쓰기(반올림). 하나의 ADD ItemCount :one 비용이 포함된 1KB 장바구니 요약 1 WCU — 읽기-수정-쓰기 SET가 포함된 동일한 행의 비용은 동일한 WCU입니다. 그러나 동시성에서는 손실됩니다. 항목의 크기를 조정하세요. item-size calculator.

이름, 입력된 값, 마샬링된 문자열 등 정확한 표현식을 작성할 수 있습니다. 요청 - DynamoDB expression builder 없음 단일 #name 또는 :value 자리 표시자를 수동으로 이스케이프합니다.

아래 사전 설정(SET + 원자 ADD)을 편집하고 UpdateExpression 진행에 따라 재구축:

요청 만들기
생성된 코드
new UpdateItemCommand({
  "TableName": "AuditLog",
  "Key": {
    "pk": {
      "S": "TENANT#acme"
    },
    "sk": {
      "S": "CONFIG"
    }
  },
  "UpdateExpression": "SET #upd0 = :updValue0 ADD #upd1 :updValue1",
  "ExpressionAttributeNames": {
    "#upd0": "plan",
    "#upd1": "seats"
  },
  "ExpressionAttributeValues": {
    ":updValue0": {
      "S": "pro"
    },
    ":updValue1": {
      "N": "5"
    }
  }
})

REMOVE — 속성 하나 또는 라인 항목 하나 삭제

REMOVE은 속성을 완전히 삭제하는 방법입니다("null로 설정" 없음 — 단지 NULL 유형을 쓰는 것입니다). 적용된 할인을 지우고 세 번째 할인 삭제 한 번의 호출에 포함된 광고 항목:

REMOVE AppliedDiscount, LineItems[2]

LineItems[2]은 인덱스 2의 요소를 제거하고 그 뒤의 모든 요소를 이동합니다. down — 인덱스 3이 2가 되는 식입니다. 하나의 인덱스에 REMOVE두 개의 인덱스가 있는 경우 표현식에서는 둘 다 원래 목록에 대해 평가되므로[2]를 제거합니다. 그리고 [3]을 함께 사용하면 예상한 대로 세 번째와 네 번째 요소가 삭제됩니다.

DELETE — 세트 멤버 제거

PromoCodes는 문자열 세트이므로 하나의 코드를 가져오는 고객은 DELETE를 사용하지만 REMOVE. REMOVE PromoCodes은 전체 세트에 핵폭탄을 발사할 것입니다. DELETE는 명명된 멤버:

DELETE PromoCodes :pulled

:pulled={"SAVE10"}의 집합이면 해당 멤버만 간다. 두 가지 규칙 여기에서는 세트가 비워질 수 없으므로 마지막 멤버를 삭제하면 해당 세트가 제거됩니다. PromoCodes 속성은 완전히; 값은 다음과 일치하는 세트 유형이어야 합니다. 속성 — 베어 문자열은 유형 오류입니다.

함께 넣어보세요

"항목 추가, 프로모션 적용, 개수 증가" 업데이트는 3번에 걸쳐 1번의 호출입니다. 조항:

SET LineItems = list_append(if_not_exists(LineItems, :empty), :newItem),
OrderTotal = OrderTotal + :price
ADD ItemCount :one
DELETE PromoCodes :expiredCode

참고 OrderTotal = OrderTotal + :priceSET 내부의 연산은 기존 가치. ADD만큼 원자적이고 경주에 안전합니다. DynamoDB는 OrderTotal + :price 현재 값에 대한 서버 측이므로 동시 호출 코드를 왕복하는 대신 항목을 직렬화하십시오.

피해야 할 함정

  • SET-먼저 읽은 카운터를 사용합니다. ADD 사용 — 읽기-수정-쓰기가 손실됩니다. 동시 업데이트. 이는 가장 일반적인 장바구니/인벤토리 버그입니다.
  • 누락된 목록에 list_append. 대상을 if_not_exists 또는 첫 번째 쓰기가 실패합니다.
  • REMOVEDELETE를 혼동합니다. REMOVE은 속성을 삭제합니다. DELETE 집합에서 구성원을 뺍니다. 혼합하면 의도한 것보다 더 많은 내용이 삭제됩니다.
  • UpdateItem를 잊어버리는 것은 upsert입니다. 키가 존재하지 않으면 항목. 다음과 같은 경우에는 ConditionExpression(attribute_exists(CartPK))를 사용하세요. "업데이트만"을 의미합니다.

이러한 표현식이 실행되는 키를 모델링하려면 다음을 참조하세요. single-table design; 어떻게 읽을지 결정하기 위해 카트를 다시 넣으세요. query vs scan를 참조하세요.

다음 중 하나를 빌드하고 복사하세요. expression builder, 그럼 try DynoTable 자신의 테이블에 놓고 항목을 지켜보세요 라이브로 바꿔보세요.

업데이트됨