新AWS DynamoDB document API允许直接对应底层 JSON 表示的 2 种新数据类型:Map(又名 JSON 对象)和 List(又名 JSON 数组)。
但是,我找不到一种方法来更新这些数据类型的属性而不完全覆盖它们。相反,可以通过添加另一个数字来更新数字属性,因此在 Java 中您可以执行以下操作:
new AttributeUpdate("Some numeric attribute").addNumeric(17);
同样你可以addElements到 Set 数据类型的属性。 (在旧的 API 中,您将使用 AttributeAction.ADD 来实现这两个目的。)
但对于 Map 或 List,似乎你必须在本地更新以前的值,然后用 PUT 代替那个值,例如在 Java 中:
List<String> list = item.getList("Some list attribute");
list.add("new element");
new AttributeUpdate("Some list attribute").put(list);
这可读性差得多,在某些情况下效率也低得多。
所以我的问题是:
有没有办法在不覆盖先前值的情况下更新 Map 或 List 数据类型的属性?例如,向 List 添加元素,或将元素放入 Map?
您将如何使用 Java API 实现它?
您是否知道 future 支持此功能的计划?
最佳答案
请查看 UpdateItem API 中的 UpdateExpression
例如给定一个带有列表的项目:
{
"hashkey": {"S" : "my_key"},
"my_list" : {"L":
[{"N":"3"},{"N":"7"} ]
}
您可以使用如下代码更新列表:
UpdateItemRequest request = new UpdateItemRequest();
request.setTableName("myTableName");
request.setKey(Collections.singletonMap("hashkey",
new AttributeValue().withS("my_key")));
request.setUpdateExpression("list_append(:prepend_value, my_list)");
request.setExpressionAttributeValues(
Collections.singletonMap(":prepend_value",
new AttributeValue().withN("1"))
);
dynamodb.updateItem(request);`
您还可以通过反转 list_append 表达式中参数的顺序来附加到列表。
像这样的表达式:SET user.address.zipcode = :zip
将寻址一个 JSON map 元素并结合表达式属性值 {":zip": {"N":"12345 "}}
关于java - 如何在 AWS DynamoDB 文档 API 上更新 map 或列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30265355/