【问题标题】:VTL: Add a new property to an maps inside an array (AWS Appsync, DynamoDB)VTL:向数组内的地图添加新属性(AWS Appsync、DynamoDB)
【发布时间】:2021-09-09 20:31:28
【问题描述】:

我是 VTL 和 AWS appsync 的新手,并试图了解事情是如何运作的。

表示列表中的步骤的映射在存储到 DynamoDB 之前应该具有带有 UUID 的属性 id。为此,我尝试遍历数组并访问 map 上的 put 方法,如下例所示。

{
  "version" : "2017-02-28",
  "operation" : "PutItem",
  "key": {
      "id" : $util.dynamodb.toDynamoDBJson($util.autoId())
  },
  #set($input = $util.dynamodb.toMapValues($ctx.args.input))
  #set($input.createdAt = $util.dynamodb.toDynamoDB($util.time.nowISO8601()))

  #foreach($step in $input.steps)
    $step.put('id', $util.dynamodb.toDynamoDBJson($util.autoId())))
  #end 

  "attributeValues": $util.toJson($input)
}

我的第二次尝试:

#foreach($step in $input.steps)
    #set($step.id = $util.dynamodb.toDynamoDBJson($util.autoId()))
  #end

但是,我的地图仍然无缘无故没有 id 属性。 foreach 循环给我的只是我尝试修改的地图的副本而不是原始对象,是否存在问题?

感谢您的宝贵时间! 希望我的问题能为 VTL 和 appsync 的所有新手提供服务

【问题讨论】:

    标签: amazon-dynamodb aws-cdk aws-appsync vtl


    【解决方案1】:

    确实如此,只是 toMapValues 实用程序方法正在返回您的 DynamoDB 类型。

    因此,如果“input.steps”应该是一个列表,那么您将在其中得到一个对象,例如 {"L": [ ... ]}

    试试这个:

    #foreach($step in $input.steps.L)
        $step.put('id', $util.dynamodb.toDynamoDBJson($util.autoId())))
      #end 
    

    【讨论】:

    • 感谢您的解释,这是一个非常好的起点!我不得不对调用 put 方法进行一些小修改以省略一些问题:$!{step.put("id", $util.dynamodb.toDynamoDBJson($util.autoId()))} 运行新的 Mutation 后,appsync 给了我一个新错误。也许你知道解决方案。 Unsupported value type 'id' in '$[attributeValues][steps][L][0]'
    • 当然,我可以帮助您解决问题。几个问题,以便我能够理解:传递给 API 的参数是什么?您在 DynamoDB 中想要的结果对象是什么? API 的输出应该是什么?
    • 我解决了这个问题。这是我这边的事情。感谢您的宝贵时间!
    猜你喜欢
    • 2019-10-20
    • 2019-05-05
    • 2018-06-23
    • 2021-03-25
    • 2022-10-07
    • 1970-01-01
    • 2021-06-11
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多