如果参数为空列表,AWS AppSync vtl make set null

问题描述

我想更新表格中的“人物”项目。 我想更新人名和他的技能集。 我们也可能只使用 updatePerson 突变来更新名称。我们稍后会更新技能。

此时参数“技能”是一个空列表。但是 DynamoDB 不允许空集。

目前我试图通过首先检查技能参数是否为空列表来解决这个问题。但它仍然告诉我“key :skills 的字符串集可能不为空”

这是我当前的请求映射模板,但 atm isNullOrDefault 检查不起作用。

#if ($util.isNullOrEmpty($context.arguments.skills))
  #set ($skills = $utils.dynamodb.toNullJson())
#else
  #set ($skills = $utils.dynamodb.toStringSetJson($context.arguments.skills))
#end

{
  "version" : "2018-05-29","operation" : "UpdateItem","key": {
    "id" : $utils.dynamodb.toDynamoDBJson($context.arguments.id)
  },"update" : {
    "expression" : "set #name = :name,#skills= :skills,"expressionNames" : {
      "#name": "name","#skills": "skills",},"expressionValues" : {
      ":name" : $utils.dynamodb.toDynamoDBJson($context.arguments.name),":skills" : $skills,}
  }
}

如果技能参数不是空数组,你知道我如何设置技能集,如果技能参数是空数组则不设置它吗?

解决方法

我认为您只需从项目 item.skills = undefined 中删除该属性,而不是将 null 设置为字符串集属性。

您可以使用 SET 和 REMOVE 操作来实现这一点。更新是根据 skills 的输入动态生成的。示例代码(我自己没有测试过)

#set ($update = {
  "expression" : "set #name = :name remove #skills","expressionNames" : {
    "#name": "name","#skills": "skills"
  },"expressionValues" : {
    ":name" : $utils.dynamodb.toDynamoDBJson($context.arguments.name)
  }
})

#if (!$util.isNullOrEmpty($context.arguments.skills))
  #set ($update = {
    "expression" : "set #name = :name set #skills = $skill","expressionNames" : {
        "#name": "name","#skills": "skills"
    },"expressionValues" : {
        ":name" : $utils.dynamodb.toDynamoDBJson($context.arguments.name),":skills" :$utils.dynamodb.toStringSetJson($context.arguments.skills),}
  })
#end

{
  "version" : "2018-05-29","operation" : "UpdateItem","key": {
    "id" : $utils.dynamodb.toDynamoDBJson($context.arguments.id)
  },"update" : $update // or maybe $util.toJson($update) 
}