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

当DynamoDB还不存在属性时,如何将映射作为属性值插入?

邢弘业
2023-03-14

有人能告诉我如何将映射设置为尚不存在的属性的值吗?我一直在尝试一个更新表达式"SET Myattr.#key=: val",但这只在属性存在并且属性的值已经是映射的情况下才有效。

我尝试使用“ADD MyAttr.#key=:val”,但后来我得到了:

UpdateExpression无效:语法错误;标记:“=”,靠近:#key=:val”

我正在使用Java。请注意,我正在尝试使用UpdateItem请求来完成此操作。我刚刚想到,这可能不适用于映射。我只是假设它会,因为如果不存在,我总是能够通过更新请求创建新的项目和/或属性(使用其他属性值数据类型,如字符串、数字等)。

共有1个答案

宋臻
2023-03-14

假设DynamoDB表中有以下项:

{
  "id": "91c2b60d-c428-403c-be42-8657b4f20669",
  "firstName": "John",
  "lastName": "Doe"
}

我们希望在地图中添加自定义属性:

Map<String, String> customAttributes = new HashMap<>();
customAttributes.put("age", "21");
customAttributes.put("gender", "Male");

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();
DynamoDB dynamodb = new DynamoDB(client);

Table table = dynamodb.getTable("users");
UpdateItemSpec updateItemSpec = new UpdateItemSpec()
          .withPrimaryKey("id", "91c2b60d-c428-403c-be42-8657b4f20669")
          .withUpdateExpression("set #customAttributes = :customAttributes")
          .withNameMap(new NameMap().with("#customAttributes", "customAttributes"))
          .withValueMap(new ValueMap().withMap(":customAttributes", customAttributes))
          .withReturnValues(ReturnValue.ALL_NEW);

UpdateItemOutcome outcome = table.updateItem(updateItemSpec);
System.out.println(outcome.getItem().toJSONPretty());

结果:

{
  "id" : "91c2b60d-c428-403c-be42-8657b4f20669",
  "firstName" : "John",
  "lastName" : "Doe",
  "customAttributes" : {
    "gender" : "Male",
    "age" : "21"
  }

}

现在,如果我们想向customAttributes映射添加一个新属性:

UpdateItemSpec updateItemSpec = new UpdateItemSpec()
    .withPrimaryKey("id", "91c2b60d-c428-403c-be42-8657b4f20669")
    .withUpdateExpression("set customAttributes.#occupation = :value")
    .withNameMap(new NameMap().with("#occupation", "occupation"))
    .withValueMap(new ValueMap().withString(":value", "Programmer"))
    .withReturnValues(ReturnValue.ALL_NEW);

UpdateItemOutcome outcome = table.updateItem(updateItemSpec);

System.out.println(outcome.getItem().toJSONPretty());

我建议您看看:DynamoDBMapper,它将为您节省大量代码。

 类似资料:
  • 我需要将源类中的字段值映射到字段属性。我可以使用Mapstruct使用@mapper注释的'expression'参数来完成 有没有其他方法可以不使用“表达式”来进行映射?

  • 我刚刚开始我的第一个DynamoDB项目,我一直在尽可能多地阅读文档。我认为我的项目最好的可能性是使用SDK中的高级DynamoDbMapper来允许CRUD操作。 在DynamoDB文档中,有一种属性值“M”的类型,可以在这里看到http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_AttributeValue.htm

  • 在我的数据库表中,我有一个列,它的内容可以是Y或N(CHECK约束)。我在Java中定义了一个String属性,在我的类中定义了一个基于String的setter。此外,为了方便起见,我添加了一个带有布尔参数的setter/getter。 那么,Hibernate基于什么属性进行映射呢?方法名称?参数名称?参数类型?在setter中使用可以吗?如果我的属性的名称与表列的名称不同,这会有什么不同吗?

  • MapStrut的新成员;对象到字符串错误: [错误] /util/LicenseMapper.java:[11,23]无法映射属性" Java . lang . object license . custom fields[]。值" to " Java . lang . string license . custom fields[]。值”。考虑声明/实现一个映射方法:“Java . lang

  • 我最近开始使用 DynamoDB,我看到要使用 DynamoDB 映射器框架,我需要先知道属性的名称,然后再将其绑定到类变量。如果我必须实现几个动态变化的属性,但仍然希望能够在扫描期间对它们设置条件,该怎么办?我尝试在类中绑定一个哈希映射(假设在变量“attrMap”下),并编写我自己的编组器来设置它。但是,我注意到它在Dynamo表中保存为一个具有复杂值的属性“attrMap”,这不允许我在扫描

  • 问题内容: 我正在尝试查询DynamoDB表以查找未设置属性的所有项目。包含该字段的表上存在一个称为的全局二级索引。 结果: 表定义: 问题答案: DynamoDB的全局二级索引允许稀疏索引。这意味着,如果您有一个GSI,但未定义该项目的哈希或范围键,则该项目将不会直接包含在GSI中。这在许多用例中很有用,因为它使您可以直接识别包含某些字段的记录。但是,如果您缺少字段,则此方法将行不通。 要获取所