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

AWS AppSync vtl make set null if argument is empty list

我想更新 table 中的 'person' 项。 我想更新这个人的名字和他的技能。 也有可能我们只使用 updatePerson 突变来更新名称。稍后我们会更新技能。

此时参数 'skills' 是一个空列表。但是 DynamoDB 不允许空集。

目前,我正在尝试通过首先检查 skills 参数是否为空列表来解决此问题。但它仍然告诉我 "An string set may not be empty for 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,
    }
  }
}

你知道如果 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) 
}