新的
AWS DynamoDB document API允许2个新的数据类型直接对应于基本的JSON表示:Map(又名JSON对象)和List(也称为JSON数组).
但是,我没有找到一种方法来更新这些数据类型的属性,而不会完全覆盖它们.相反,可以通过添加另一个数字来更新Number属性,因此在Java中可以执行以下操作:
new AttributeUpdate("Some numeric attribute").addNumeric(17);
类似地,您可以将addElements设置为设置数据类型的属性. (在旧API中,您将使用AttributeAction.ADD用于这两个目的.)
但是对于地图或列表,您似乎必须在本地更新以前的值,然后将其替换为该值,例如在Java中:
List<String> list = item.getList("Some list attribute"); list.add("new element"); new AttributeUpdate("Some list attribute").put(list);
这是可读性差得多的,在某些情况下效率更低.
所以我的问题是:
>有没有办法更新Map或List数据类型的属性,而不覆盖以前的值?例如,要将一个元素添加到列表中,或将元素放在地图中?
>如何使用Java API实现它?
>你知道未来支持这个计划吗?
解决方法
请查看
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映射元素与表达式属性值{“:zip”:{“N”:“12345”}}