UpdateItem - AWS AppSync

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

UpdateItem

UpdateItem요청 매핑 문서를 사용하면 AWS AppSync DynamoDB 해석기에 DynamoDB에 UpdateItem 요청하도록 지시하고 다음을 지정할 수 있습니다.

  • DynamoDB의 항목 키

  • DynamoDB에서 항목 업데이트 방법을 설명하는 업데이트 표현식

  • 성공할 작업의 조건

UpdateItem 매핑 문서의 구조는 다음과 같습니다.

{ "version" : "2018-05-29", "operation" : "UpdateItem", "customPartitionKey" : "foo", "populateIndexFields" : boolean value, "key": { "foo" : ... typed value, "bar" : ... typed value }, "update" : { "expression" : "someExpression", "expressionNames" : { "#foo" : "foo" }, "expressionValues" : { ":bar" : ... typed value } }, "condition" : { ... }, "_version" : 1 }

필드는 다음과 같이 정의됩니다.

UpdateItem 필드

version

템플릿 정의 버전. 2017-02-282018-05-29만 현재 지원됩니다. 이 값은 필수입니다.

operation

수행할 DynamoDB 작업입니다. UpdateItem DynamoDB 작업을 수행하려면 이 값을 UpdateItem으로 설정해야 합니다. 이 값은 필수입니다.

key

DynamoDB의 항목 키입니다. DynamoDB 항목은 테이블 구조에 따라 단일 해시 키 또는 해시 키와 정렬 키를 가질 수 있습니다. '입력된 값' 지정에 대한 자세한 내용은 유형 시스템(요청 매핑)을 참조하세요. 이 값은 필수입니다.

update

update 섹션에서는 DynamoDB의 항목 업데이트 방법을 설명하는 업데이트 표현식을 지정합니다. 업데이트 표현식을 작성하는 방법에 대한 자세한 내용은 UpdateExpressions DynamoDB 설명서를 참조하십시오. 이 섹션은 필수입니다.

update 섹션에는 다음 세 가지 구성 요소가 있습니다.

expression

업데이트 표현식. 이 값은 필수입니다.

expressionNames

표현식 속성 name 자리 표시자의 대체 항목으로, 키-값 페어의 형식으로 표시됩니다. 키는 expression에 사용된 name 자리 표시자에 해당하고 값은 DynamoDB에 있는 항목의 속성 이름에 해당하는 문자열이어야 합니다. 이 필드는 선택 사항으로, expression에 사용된 표현식 속성인 name 자리 표시자의 대체 항목으로만 채워져야 합니다.

expressionValues

표현식 속성 value 자리 표시자의 대체 항목으로, 키-값 페어의 형식으로 표시됩니다. 키는 expression에 사용되는 value 자리 표시자에 해당하고 값은 입력된 값이어야 합니다. '입력된 값'을 지정하는 방법에 대한 자세한 내용은 유형 시스템(요청 매핑)을 참조하세요. 입력된 값은 지정되어 있어야 합니다. 이 필드는 선택 사항으로, expression에 사용된 표현식 속성인 value 자리 표시자의 대체 항목으로만 채워져야 합니다.

condition

DynamoDB에 이미 있는 객체의 상태를 기반으로 요청의 성공 여부를 결정하는 조건. 조건을 지정하지 않으면 UpdateItem 요청이 현재 상태와 상관 없이 기존 항목을 업데이트합니다. 조건에 대한 자세한 내용은 조건 표현식을 참조하세요. 이 값은 선택 사항입니다.

_version

항목의 알려진 최신 버전을 나타내는 숫자 값입니다. 이 값은 선택 사항입니다. 이 필드는 충돌 감지에 사용되며 버전이 지정된 데이터 원본에만 지원됩니다.

customPartitionKey

이 문자열 값이 활성화되면 버전 관리가 활성화되었을 때 델타 동기화 테이블에서 사용되는 ds_skds_pk 레코드의 형식을 수정합니다 (자세한 내용은 개발자 안내서의 충돌 감지 및 동기화 참조).AWS AppSync 활성화되면 populateIndexFields 항목 처리도 활성화됩니다. 이 필드는 선택 사항입니다.

populateIndexFields

customPartitionKey와 함께 활성화되면 델타 동기화 테이블, 특히 gsi_ds_pkgsi_ds_sk 열의 각 레코드에 대해 새 항목을 생성하는 부울 값입니다. 자세한 내용은 AWS AppSync 개발자 안내서의 충돌 감지 및 동기화를 참조하십시오. 이 필드는 선택 사항입니다.

DynamoDB에서 업데이트된 항목은 자동으로 GraphQL JSON 및 프리미티브 유형으로 변환되며 매핑 컨텍스트 () 에서 사용할 수 있습니다. $context.result

DynamoDB 형식 변환에 대한 자세한 내용은 형식 시스템(응답 매핑)을 참조하세요.

응답 매핑 템플릿에 대한 자세한 내용은 해석기 매핑 템플릿 개요를 참조하세요.

예 1

다음 예제는 GraphQL 변형 upvote(id: ID!)의 매핑 템플릿입니다.

이 예에서 DynamoDB의 항목에는 1씩 증가하는 upvotesversion 필드가 있습니다.

{ "version" : "2017-02-28", "operation" : "UpdateItem", "key" : { "id" : $util.dynamodb.toDynamoDBJson($ctx.args.id) }, "update" : { "expression" : "ADD #votefield :plusOne, version :plusOne", "expressionNames" : { "#votefield" : "upvotes" }, "expressionValues" : { ":plusOne" : { "N" : 1 } } } }

예제 2

다음 예제는 GraphQL 변형 updateItem(id: ID!, title: String, author: String, expectedVersion: Int!)의 매핑 템플릿입니다.

다음은 인수를 조사해 클라이언트에서 제공한 인수만 포함하는 업데이트 표현식을 동적으로 생성하는 복잡한 예입니다. 예를 들어, titleauthor는 생략되면 업데이트되지 않습니다. 인수가 지정되어 있으나 그 값이 null이면 DynamoDB의 객체에서 해당 필드가 삭제됩니다. 마지막으로, 이 작업에는 DynamoDB에 현재 있는 항목에 expectedVersion으로 설정된 version 필드가 있는지 확인하는 조건이 있습니다.

{ "version" : "2017-02-28", "operation" : "UpdateItem", "key" : { "id" : $util.dynamodb.toDynamoDBJson($ctx.args.id) }, ## Set up some space to keep track of things we're updating ** #set( $expNames = {} ) #set( $expValues = {} ) #set( $expSet = {} ) #set( $expAdd = {} ) #set( $expRemove = [] ) ## Increment "version" by 1 ** $!{expAdd.put("version", ":newVersion")} $!{expValues.put(":newVersion", { "N" : 1 })} ## Iterate through each argument, skipping "id" and "expectedVersion" ** #foreach( $entry in $context.arguments.entrySet() ) #if( $entry.key != "id" && $entry.key != "expectedVersion" ) #if( (!$entry.value) && ("$!{entry.value}" == "") ) ## If the argument is set to "null", then remove that attribute from the item in DynamoDB ** #set( $discard = ${expRemove.add("#${entry.key}")} ) $!{expNames.put("#${entry.key}", "$entry.key")} #else ## Otherwise set (or update) the attribute on the item in DynamoDB ** $!{expSet.put("#${entry.key}", ":${entry.key}")} $!{expNames.put("#${entry.key}", "$entry.key")} #if( $entry.key == "ups" || $entry.key == "downs" ) $!{expValues.put(":${entry.key}", { "N" : $entry.value })} #else $!{expValues.put(":${entry.key}", { "S" : "${entry.value}" })} #end #end #end #end ## Start building the update expression, starting with attributes we're going to SET ** #set( $expression = "" ) #if( !${expSet.isEmpty()} ) #set( $expression = "SET" ) #foreach( $entry in $expSet.entrySet() ) #set( $expression = "${expression} ${entry.key} = ${entry.value}" ) #if ( $foreach.hasNext ) #set( $expression = "${expression}," ) #end #end #end ## Continue building the update expression, adding attributes we're going to ADD ** #if( !${expAdd.isEmpty()} ) #set( $expression = "${expression} ADD" ) #foreach( $entry in $expAdd.entrySet() ) #set( $expression = "${expression} ${entry.key} ${entry.value}" ) #if ( $foreach.hasNext ) #set( $expression = "${expression}," ) #end #end #end ## Continue building the update expression, adding attributes we're going to REMOVE ** #if( !${expRemove.isEmpty()} ) #set( $expression = "${expression} REMOVE" ) #foreach( $entry in $expRemove ) #set( $expression = "${expression} ${entry}" ) #if ( $foreach.hasNext ) #set( $expression = "${expression}," ) #end #end #end ## Finally, write the update expression into the document, along with any expressionNames and expressionValues ** "update" : { "expression" : "${expression}" #if( !${expNames.isEmpty()} ) ,"expressionNames" : $utils.toJson($expNames) #end #if( !${expValues.isEmpty()} ) ,"expressionValues" : $utils.toJson($expValues) #end }, "condition" : { "expression" : "version = :expectedVersion", "expressionValues" : { ":expectedVersion" : $util.dynamodb.toDynamoDBJson($ctx.args.expectedVersion) } } }

DynamoDB에 대한 자세한 내용은 UpdateItem API DynamoDB 설명서를 참조하십시오. API