如何在DynamoDB中更新许多属性

时间:2019-03-15 17:17:29

标签: java amazon-dynamodb

我已经看到了很多使用UpdateExpression通过updateItem方法更新属性的示例。但是,我仍然不了解如何动态地同时更新DynamoDB中的多个属性。

我正在尝试在同一updateItem调用中更新并重命名多个属性。 我了解这需要删除旧名称和SET新名称。我在对象的hashedId中使用了这些名称,但是直到运行时才使用它们。所以我的问题是如何将UpdateExpression与变量而不是硬编码的String一起使用?

我看到的所有示例都使用硬编码的UpdateExpressions。

can't update item in DynamoDB

Dynamo DB : UpdateItemSpec : Multiple Update Expression - Not Working

DynamoDB update Item multi action

How to rename DynamoDB column/key

我正在使用Java。

对我来说我找不到一个例子似乎很奇怪……这使我相信我做错了什么。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您必须基于在运行时收到的属性名称和值动态构建更新表达式字符串。我正是这样做的。我不在Java中工作,但是这里有一些伪代码(带有Ruby偏见)示例,可以动态构建更新表达式字符串,表达式属性名称哈希和表达式属性值哈希。然后,您可以将这三件事插入update_item方法:


update_exp_set = [] //array of remove expression snippets
update_exp_remove = [] //array of update expression snippets

exp_attribute_names = {} //hash of attribute names
exp_attribute_values = {} //hash of attribute values

// Iterate through all your fields and add things as needed to your arrays and hashes.
// Two examples are below for a field with the name <fieldName> and value <fieldValue>.
// You'll need to convert this to Java and update it to make sense with the AWS Java SDK.

// For a given field that needs to be updated:
update_exp_set << "#<fieldName> = :fieldValue" //add to array of set expression snippets
exp_attribute_names["#<fieldName>"] = "<fieldName>" //add to hash of attribute names
exp_attribute_values[":<fieldValue>"] = "<fieldValue>" //add to hash of attribute values

// For a given field that needs to be removed:
update_exp_remove << "#<fieldName>"
exp_attribute_names["#<fieldName>"] = "<fieldName>" //add to hash of attribute names

// Use your snippets to create your full update expression:
update_exp_set_clause = ""
update_exp_remove_clause = ""
if update_exp_set.length != 0 //check if you have something to set
  update_exp_set_clause = "SET " + update_exp_set.join(',')
end
if update_exp_remove.length != 0 //check if you have something to remove
  update_exp_remove_clause = "REMOVE" + update_exp_remove.join(',')
end
final_update_exp = update_exp_set_clause + " " + update_exp_remove_clause

有帮助吗?