当前位置: 首页 > 知识库问答 >
问题:

使用DynamoDBMapper更新地图属性中的现有条目

赖俊
2023-03-14

我正在使用AWSJavaSDK的DynamoDBMapper,并处理一个相当简单的项目:它有一个字符串属性(用作哈希键)和一个map属性。

@DynamoDBTable(tableName = "MyTable")
public class MyItem {
    private String myStringAttr;
    private Map<String, String> myMapAttr;

    @DynamoDBHashKey(attributeName = "MyStringAttribute")
    public String getMyKeyAttr() { return myKeyAttr; }
    public void setMyKeyAttr(String myKeyAttr) { this.myKeyAttr = myKeyAttr; }

    @DynamoDBAttribute(attributeName = "MyMapAttribute")
    public Map<String, String> getMyMapAttr() { return myMapAttr; }
    public void setMyMapAttr(Map<string, string> myMapAttr) { this.myMapAttr = myMapAttr; }
}

我可以使用load()save()方法读写我的对象。我遇到的问题是,当我需要在映射中为表中的现有项更新或添加单个条目时。在不知道所述项的映射的现有条目的情况下(并且我不想每次尝试更新或添加之前都执行load()),我似乎能做的最好的事情就是删除整个映射,并用我尝试更新或添加的单个条目替换它。是否可以使用DynamoDBMapper向现有项目的map属性添加/更新单个条目?

我已经研究了DynamoDBSaveExpressionDynamoDBMapperConfig提供的各种选项。我能找到的最接近的选项是DynamoDBMapperConfig。拯救行为。APPEND_SET,但这是用于SET类型属性,而不是我正在使用的映射类型。

我能够使用文档API的updateItem()方法以及包含如下所示的UpdateExpression的UpdateItemSpec来实现这个确切的用例。如果给定的键还不存在,这将向映射中添加一个新条目;如果现有条目确实存在,则将该值更新为一个特定的值,所有这些都不涉及映射中的其他条目。然而,我发现使用文档API相当麻烦,如果可能的话,我更愿意使用DynamoDBMapper

Table table = dynamoDB.getTable("MyTable");

UpdateItemSpec updateItemSpec = new UpdateItemSpec()
    .withPrimaryKey("MyStringAttribute", 1)
    .withUpdateExpression("set #mma.#mek = :mev")
    .withNameMap(new NameMap()
        .with("#mma", "MyMapAttribute")
        .with("#mek", "SomeMapEntryKey")
    .withValueMap(new ValueMap()
        .withString(":mev", "Some map entry value"));

UpdateItemOutcome outcome =  table.updateItem(updateItemSpec);

共有1个答案

轩辕炎彬
2023-03-14

一种可能的解决办法是:-

1) 使用DynamoDBMapper load从表“MyTable”中获取数据

2) 在步骤1中检索到的对象中向映射添加新条目,并使用DynamoDBMapper with config保存该对象,如下所述

DynamoDBMapperConfig dynamoDBMapperConfig = new DynamoDBMapperConfig(SaveBehavior.UPDATE);

我知道这是一个两步的过程。然而,当我处于同样的情况下,我已经尝试了很多,但没有找到任何解决方案,使用DynamoDBMapper直接更新“Map”数据类型。

希望这有帮助!

 类似资料:
  • 我想使用DynamoDBMapper只更新项目的特定属性。例如,我有一个带有属性的用户表。,id,name,地址。 我想只更新地址属性,而不是其他字段(选择性更新)。 我可以使用UpdateItemSpec找到一个示例,但在DynamoDBMapper中找不到。使用UpdateItemSpec,我可以使用withUpdateExpression()定义更新表达式。更多细节可以在这里找到。 是否有任

  • 问题内容: 我正在使用“可拖动”指令来支持图像拖动。但是,根据用户的角色,我需要为某些用户组禁用图像拖动。我使用了以下代码。 该方法在模板范围内,并返回或。我不想为所返回的每个值创建两个大的重复元素。换句话说,我不是在寻找以下方法来解决此问题。 还有其他方法可以避免代码重复吗? 问题答案: Angular包含对有条件声明HTML属性的支持,作为动态标题指令。 的官方文件 例 在您的情况下,代码可能

  • 我想有条件地显示和隐藏这个按钮组,这取决于从父组件传递的内容,看起来像这样: .... .... 然而,{this.props.showBulkActions'show':'hidden'并没有发生任何事情。我做错什么了吗?

  • 问题内容: 我正在NHibernate中对单个属性执行标准更新。但是,在提交事务时,sql更新似乎设置了我映射到表上的所有字段,即使它们没有更改。当然这不是Nhibernate中的正常行为吗?难道我做错了什么?谢谢 问题答案: 这是正常现象。您可以尝试添加到类定义中以覆盖此行为。

  • 我有一个表单,其中包含所需的数据,我使用了以下代码: 在同一页面上有一个datatable,它包含我通过表单添加的对象(付款)。添加对象后,我使用以下代码对datable进行更新以添加新对象: 我遇到的问题是,当数据没有输入,我单击按钮,更新完成,表显示为空!但是,验证消息正确地显示为强制数据。 datatable是 我在CDI中使用,因为托管bean如下所示://import //类 }

  • 更准确地说,我甚至想要更详细的东西:目标应该是一个包含三个属性的类,其中产生的目标值必须被拆分为三个属性。例如,如果mysource.propa的值为“abc”,那么目标myTarget应该得到一个类似于“v01.123.456.ab”的值。该值依次分为preValue、middleValue和endvalue: preValue=“V01” middleValue=“123.456”