1

我想对 dynamoDB 进行更新调用:

  1. 如果 ddb 项目存在,则更新现有字符串集的新值(添加而不是替换),
  2. 或者如果 ddb 项目尚不存在,则创建一个新项目。
  3. 但这两种情况都应该只用一个 api 调用来解决。

UpdateItem通过使用以下操作,我目前可以做到这一点:

val requestParameters =
  s"""
     |{
     |    "TableName": "custom_table_name",
     |    "Key": {
     |          "id": {
     |              "S": "custom_id"
     |          }
     |    },
     |    "UpdateExpression": "ADD user_list :newItem",
     |    "ExpressionAttributeValues": {
     |        ":newItem": { "SS": ["user1","user2"] }
     |    }
     |}
     |""".stripMargin

但我现在想切换到PartiQLExecuteStatement ,我通过操作使用提出了以下想法:

val requestParameters =
  s"""
     |{
     |    "Statement": "UPDATE custom_table_name SET user_list=SET_ADD(user_list, ?) WHERE id='custom_id'",
     |    "Parameters": [
     |     {
     |       "SS": ['user1','user2']
     |     }
     |    ]
     |}
     |""".stripMargin

对于 PartiQL 解决方案,如果该项目确实存在,则一切都按预期工作,但如果该项目不存在,我会得到:

"400 Bad Request"/"The conditional request failed"(因为密钥还不存在)

但我现在不想再次调用以在 PartiQL 下插入新项目,我宁愿只使用 1 个 API 调用来处理这两种情况,因为可以通过 UpdateItem 使用。

有什么想法可以在 PartiQL 下实现吗?


文件:

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.update.html -> PartiQL 只有 SET 和 REMOVE https://docs.aws.amazon.com/amazondynamodb/latest/developerguide /Expressions.UpdateExpressions.html#Expressions.UpdateExpressions -> 较旧的 UpdateExpressions 具有 SET、REMOVE、ADD和 DELETE


(我在不使用 AWS SDK的情况下直接向dynamoDB 低级 api发出请求)

4

1 回答 1

1

您正在寻找的内容称为“upsert”。

这是一个 Twitter 线程,讨论如何在 PartiQL 中不可能:https ://twitter.com/__steele/status/1445605614248366088

于 2022-02-24T22:40:21.477 回答