如何使用Java删除DynamoDB中的项?

如何使用Java删除DynamoDB中的项?,java,amazon-web-services,amazon-s3,amazon-dynamodb,Java,Amazon Web Services,Amazon S3,Amazon Dynamodb,我知道这听起来像一个简单的问题,但由于某种原因,我无法在网上或通过StackOverflow找到明确的答案 我有一个DynamoDB和一个名为“ABC”的表格。主键是字符串形式的“ID”,其他属性之一是字符串形式的“Name”。如何使用Java从该表中删除项目 AmazonDynamoDBClient dynamoDB; . . . DeleteItemRequest dir = new DeleteItemRequest(); dir.withC

我知道这听起来像一个简单的问题,但由于某种原因,我无法在网上或通过StackOverflow找到明确的答案

我有一个DynamoDB和一个名为“ABC”的表格。主键是字符串形式的“ID”,其他属性之一是字符串形式的“Name”。如何使用Java从该表中删除项目

    AmazonDynamoDBClient dynamoDB;
    .
    .
    .
    DeleteItemRequest dir = new DeleteItemRequest();
    dir.withConditionExpression("ID = 214141").withTableName("ABC");
    DeleteItemResult deleteResult = dynamoDB.deleteItem(dir);
我有一个验证例外:

Exception in thread "main" com.amazonaws.AmazonServiceException: 1 validation error detected: Value null at 'key' failed to satisfy constraint: Member must not be null (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: RQ70OIGOQAJ9MRGSUA0UIJLRUNVV4KQNSO5AEMVJF66Q9ASUAAJG)
    at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:1160)
    at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:748)
    at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:467)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:302)
    at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.invoke(AmazonDynamoDBClient.java:3240)
    at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.deleteItem(AmazonDynamoDBClient.java:972)
    at DynamoDBUploader.deleteItems(DynamoDBUploader.java:168)
    at Main.main(Main.java:56)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

如果为了删除DynamoDB表中的项,我需要知道散列键,那么我想我可能需要重新设计数据库,以便高效地删除项

我的桌子看起来像这样: 如果是这样的话,啊。。。我想我需要重新设计我的数据库表

ID | Name | Date | Value
-----------------------------------
1  | TransactionA | 2015-06-21 | 30
2  | TransactionB | 2015-06-21 | 40
3  | TransactionC | 2015-06-21 | 50

基本上,我想轻松删除日期为“2015-06-21”的所有交易。如何在不必处理哈希键ID的情况下简单快速地执行此操作?

AWS DynamoDB知道作为表哈希键的列。 您只需要指定要删除的值。 DeleteItemRequest有一个流畅的API:

Key keyToDelete = new Key().withHashKeyElement(new AttributeValue("214141"));
DeleteItemRequest dir = new DeleteItemRequest()
    .withTableName("ABC")
    .withKey(keyToDelete);

问:我们需要知道删除DynamoDB表中的一个项目的散列键吗?嗨,Sharon,我在最底部更新了我原来的帖子。最后一部分你能给我指点一下吗?基本上,我想轻松删除日期为“2015-06-21”的所有交易。如何在不处理散列键ID的情况下简单快速地执行此操作?DynamoDB只允许删除一个散列键,并且必须指定它。它确实有范围键的概念:它是一个选项,当指定时,您有一个主键,它是哈希+范围的组合。删除时,除了哈希键之外,还可以指定值的“范围”(哈希键仍需要指定为唯一),因此如果可能,可以将日期指定为哈希,将ID指定为范围。但是,这意味着您不能仅通过ID获取。请注意,AWS还有SimpleDB,它具有更大的查询功能,但会牺牲表大小限制。谢谢sharon。。。所以在我的数据库方案中,ID、名称、日期、值。。。。似乎我需要提前知道ID和日期才能删除每一行。我希望通过知道日期就可以删除所有3行