AWS AppSyn c Дизайн единой таблицы DynamoDB: PutItem на основе значения поля другого элемента - PullRequest
0 голосов
/ 13 июля 2020

Я новичок в AWS AppSyn c, и я принял шаблон единой таблицы в DynamoDB. Теперь я пытаюсь создать элемент на основе определенного значения поля в существующем элементе в той же таблице. Например, у меня есть таблица с именем транзакция , которая содержит 2 типа записей.

  1. Запрос
  2. Ответ

введите описание изображения здесь

Как вы можете видеть в таблице выше, я могу вставить (PutItem) несколько ответов на конкретный запрос. Прежде чем вставлять новый ответ, мне нужно проверить, существует ли уже запрос (RequestID). Есть ли способ сделать это через условное выражение в преобразователе? Ниже приведен мой текущий код преобразователя запросов, который не работает должным образом.

#set( $Id = $util.autoId() )
{
"version" : "2017-02-28",
"operation" : "PutItem",
"key" : {
    "PK": $util.dynamodb.toDynamoDBJson("USER#$ctx.args.input.UserId"),
    "SK": $util.dynamodb.toDynamoDBJson("RESPONSE#$Id"),
},
"attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args.input),
 "condition": {
        "expression": "SK = :SK",
        "expressionValues" : {
                   ":SK" : {
                       "S" : "REQUEST#${ctx.args.input.RequestId}"
                   }
     }
  }

}

Ответы [ 2 ]

1 голос
/ 21 июля 2020

Вы можете сделать это в одном шаблоне сопоставления запросов, используя транзакции DynamoDB, см. (https://docs.aws.amazon.com/appsync/latest/devguide/tutorial-dynamodb-transact.html).

В одном из «transactWriteItems» вы обновляете произвольное значение ( или, возможно, количество ответов) в элементе запроса с условием, которое проверяет, существует ли элемент запроса с этим requestId в SK. Если условия выполнены успешно, элемент запроса обновляется.

Также убедитесь, что у вас есть элемент ответа в ваших «transactWriteItems», чтобы элемент ответа также записывался, если условие запроса выполнено.

0 голосов
/ 18 июля 2020

Вы не сможете выполнить условный PutItem на основе другого номера записи. В этом случае вы захотите использовать преобразователи конвейера . В своей первой функции вы должны получить элемент запроса, а во второй вы можете выполнить свое условие PutItem - предыдущий результат GetItem будет доступен как $ctx.prev.result.

...