我正在尝试找出从 Dynamo DB 中的项目中删除属性的最佳方法。下面是我尝试过的,但我收到一个异常,说类型 N 或 S 都不支持 DELETE。
线程“main”中出现异常状态代码:400、AWS 服务:AmazonDynamoDB、AWS 请求 ID:09MRO4PVTJ8IK6OHLKSM551REJVV4KQNSO5AEMVJF66Q9ASUAAJG、AWS 错误代码:ValidationException、AWS 错误消息:一个或多个参数值无效:类型 N 不支持操作 DELETE 在 com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:544) 在 com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:284) 在 com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:169) 在 >com.amazonaws.services.dynamodb.AmazonDynamoDBClient.invoke(AmazonDynamoDBClient.java:675) 在 >com.amazonaws.services.dynamodb.AmazonDynamoDBClient.updateItem(AmazonDynamoDBClient.java:371)
Key pk = new Key(new AttributeValue().withN(Long.toString(123)));
AttributeValueUpdate avu = new AttributeValueUpdate(new AttributeValue().withN("555"), "DELETE");
Map<String, AttributeValueUpdate> m = new HashMap<String, AttributeValueUpdate>();
m.put(String.valueOf(555), avu);
UpdateItemRequest uir = new UpdateItemRequest("users", pk, m);
dynamoDB.updateItem(uir);
令人困惑的一点是为什么属性值对于删除很重要。我确实想删除属性名称和任何关联的值,但在 SDK 中找不到合适的方法来执行此操作。
如有帮助,我们将不胜感激。
我可以发誓我已经尝试过这个,但是通过用空值替换 AttributeValue 它可以工作:
Key pk = new Key(new AttributeValue().withN(Long.toString(123)));
AttributeValueUpdate avu = new AttributeValueUpdate(null, "DELETE");
Map<String, AttributeValueUpdate> m = new HashMap<String, AttributeValueUpdate>();
m.put(String.valueOf(555), avu);
UpdateItemRequest uir = new UpdateItemRequest("users", pk, m);
dynamoDB.updateItem(uir);
对于科特林:
dynamoDB.updateItem( UpdateItemRequest(
"users",
Key(AttributeValue().withN(123L.toString()),
mapOf("555" to AttributeValueUpdate(null, "DELETE"))
))
这也有效。
Table table = dynamoDB.getTable("users");
table.updateItem(
new PrimaryKey("<MY HASH KEY NAME>", <MY HASH VALUE>),
new AttributeUpdate("columnToRemove").delete()
);
或者 您甚至可以在项目更新中使用表达式。
REMOVE - 从项目中删除一个或多个属性。
在更新表的项目时从 Dynamo DB 删除属性
UpdateItemRequest updateItemRequest =new UpdateItemRequest().withTableName(tableName).withKey(key);
updateItemRequest.addAttributeUpdatesEntry("privileges",new AttributeValueUpdate()
.withAction(AttributeAction.DELETE));
updateItemRequest.addAttributeUpdatesEntry("description", new AttributeValueUpdate()
.withValue(new AttributeValue().withS("description")));
在上面的示例中,首先我从 Item 中删除了
privileges
,然后更新了 Item 中的 description
。