首页 > 解决方案 > Dynamodb 条件更新根据条件添加或删除

问题描述

我有一个 dynamodb 表,其中一列是 Map 类型。我想要一个更新查询,如果该项目在地图中,则从地图中删除该项目,或者如果该项目不在地图中,则将该项目添加到地图中。我怎样才能为这个问题写一个VTL?

标签: javascriptnosqlamazon-dynamodbdynamodb-queriesvtl

解决方案


您必须为此使用管道解析器。

我在一个类似的情况下对 like/unlike with a single mutation 进行了此操作。

您可以根据您的任务更改和调整此代码。

likeEvent.req.vtl

#if( "$context.identity.username" =="guest")
   $util.unauthorized()
#end

#set($id=$util.autoId())
$util.qr($ctx.stash.put("sk", ".."))
$util.qr($ctx.stash.put("skBegining", ".."))
$util.qr($ctx.stash.put("id", ".."))
{}
likeEvent.res.vtl
{
    "value": "success"
}

checkIfLiked.req.vtl

{
  "version": "2018-05-29",
  "operation": "Query",
  "index": "creator-sk-index",
  "query" : {
           "expression": "creator = :creator  and begins_with(sk, :sk)  ",
           "expressionValues" : {
                ":creator" :  $util.dynamodb.toDynamoDBJson("$context.identity.username"),
                ":sk" :  $util.dynamodb.toDynamoDBJson("$ctx.stash.skBegining")
      }
  }
}

checkIfLiked.res.vtl

$util.toJson($ctx.result)

像.req.vtl

#if( "$context.stash.username" =="guest")
   $util.unauthorized()
#end
#set($sk=$ctx.stash.sk)
#set($id=$ctx.stash.id)
#set( $input = {} )
$util.qr($input.put("updatedAt", $util.time.nowEpochSeconds()))
$util.qr($input.put("createdAt", $util.time.nowEpochSeconds()))
$util.qr($input.put("creator", "$ctx.identity.username"))

#if($context.prev.result.items.size()!=0)
  {
      "version" : "2017-02-28",
      "operation" : "DeleteItem",
      "key" : {
          "id": $util.dynamodb.toDynamoDBJson("$context.prev.result.items[0].id"),
          "sk": $util.dynamodb.toDynamoDBJson("$context.prev.result.items[0].sk")
      }
  }
#else
  {
      "version" : "2017-02-28",
      "operation" : "PutItem",
      "key" : {
          "id": $util.dynamodb.toDynamoDBJson("$id"),
          "sk": $util.dynamodb.toDynamoDBJson("$sk")
      },
       "attributeValues" : $util.dynamodb.toMapValuesJson($input)

  }
#end

像.res.vtl

{
    "value": "success"
}

推荐阅读