java - 如何在 AWS DynamoDB 文档 API 上更新 map 或列表?

标签 java amazon-dynamodb

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);

这可读性差得多,在某些情况下效率也低得多。

所以我的问题是:

  1. 有没有办法在不覆盖先前值的情况下更新 Map 或 List 数据类型的属性?例如,向 List 添加元素,或将元素放入 Map?

  2. 您将如何使用 Java API 实现它?

  3. 您是否知道 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/

相关文章:

java - java中的数组初始化

java - Spring Boot Security hasRole 被忽略

java - "String[]::new"是什么意思?

amazon-web-services - 从 DynamoDB 表创建数据湖

java - DynamoDB 中分区键内多列组合的唯一约束

java - OpenCV 特征检测器

java - 如何使用java在文本文件上写入内容?

python - 使用 Python/Boto 更新 DynamoDB 原子计数器

amazon-dynamodb - AWS DynamoDB 中没有任何注释的普通 POJO

python - 每 X 秒通过 URL 自动检索 JSON 数据并存储在 Amazon DynamoDB 中