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

Java 当DynamoDB还不存在属性时,如何将映射作为属性值插入?,java,amazon-web-services,amazon-dynamodb,Java,Amazon Web Services,Amazon Dynamodb,有人能告诉我如何将地图设置为尚未存在的属性的值吗。我一直在尝试一个更新表达式“SET MyAttr.#key=:val”,但是只有当属性存在并且属性的值已经是映射时,它才起作用 我尝试使用“ADD MyAttr.#key=:val”,但是我得到了: UpdateExpression无效:语法错误;标记:=,靠近:#键=:val 我正在使用Java。请注意,我正在尝试使用UpdateItem请求来完成此操作。我突然想到也许这不适用于地图。我只是假设它会出现,因为如果不存在更新请求(使用其他属性值数

有人能告诉我如何将地图设置为尚未存在的属性的值吗。我一直在尝试一个更新表达式
“SET MyAttr.#key=:val”
,但是只有当属性存在并且属性的值已经是映射时,它才起作用

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

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


我正在使用Java。请注意,我正在尝试使用UpdateItem请求来完成此操作。我突然想到也许这不适用于地图。我只是假设它会出现,因为如果不存在更新请求(使用其他属性值数据类型,如字符串、数字等),我总是能够创建一个新项和/或属性。让我们假设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());
}

现在,如果要向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());

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

假设我们的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());
}

现在,如果要向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());

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

这确实回答了我提出的问题,而且很有效。但是,如果地图已经存在,是否有可能执行更新,从而使Dynamo添加到地图中?您提供的解决方案将覆盖任何现有地图。或者我必须先查询项目,然后根据项目/attr当前是否存在创建不同的
UpdateItemSpec
?是的,这是可能的!我将编辑我的答案以向您展示一个示例。感谢您的更新,但我正在寻找的是一个一次性更新,它将(或)。使用“我的键/值”对创建映射,如果项目和/或属性尚不存在,则将映射设置为“我的属性”的值,或b)。使用指定的键/值对更新“我的属性”中的现有映射。我认为这不可能在一个单独的请求中实现:这确实回答了我提出的问题,而且有效。但是,如果地图已经存在,是否有可能执行更新,从而使Dynamo添加到地图中?您提供的解决方案将覆盖任何现有地图。或者我必须先查询项目,然后根据项目/attr当前是否存在创建不同的
UpdateItemSpec
?是的,这是可能的!我将编辑我的答案以向您展示一个示例。感谢您的更新,但我正在寻找的是一个一次性更新,它将(或)。使用“我的键/值”对创建映射,如果项目和/或属性尚不存在,则将映射设置为“我的属性”的值,或b)。使用指定的键/值对更新“我的属性”中的现有映射。但我认为这不可能在一个请求中实现: