AWS DynamoDB通过Java SDK删除

时间:2016-04-26 15:03:50

标签: java amazon-web-services amazon-dynamodb

尝试通过AWS Java SDK进行删除时出现错误

  

提供的关键元素与架构不匹配(服务:AmazonDynamoDBv2;状态码:400;错误代码:ValidationException;请求ID:52N303HS3D535K28KSN3R3803VVV4KQNSO5AEMVJF66Q9ASUAAJG)

我定义的删除项目规范看起来像这样

DeleteItemSpec deleteItemSpec = new DeleteItemSpec()
            .withPrimaryKey("pk", messageId)
            .withConditionExpression("#ip > :val")
            .withNameMap(new NameMap()
                    .with("#ip", "timestamp"))
            .withValueMap(new ValueMap()
                    .withNumber(":val", 0))
            .withReturnValues(ReturnValue.NONE);

我的表就是这样创建的

List<AttributeDefinition> attributeDefinitions = new ArrayList<>();
    attributeDefinitions.add(new AttributeDefinition()
            .withAttributeName("pk")
            .withAttributeType(ScalarAttributeType.S));
    attributeDefinitions.add(new AttributeDefinition()
            .withAttributeName("timestamp")
            .withAttributeType(ScalarAttributeType.N));

    List<KeySchemaElement> keySchema = new ArrayList<>();
    keySchema.add(new KeySchemaElement()
            .withAttributeName("pk")
            .withKeyType(KeyType.HASH));
    keySchema.add(new KeySchemaElement()
            .withAttributeName("timestamp")
            .withKeyType(KeyType.RANGE));

我想知道时间戳的排序键是否导致了这个问题。我是否需要指定&gt;以外的时间戳? 0?

1 个答案:

答案 0 :(得分:2)

问题是您在删除对象时必须同时指定哈希和范围键。你的哈希键是&#34; pk&#34;你的范围键是&#34;时间戳&#34;但是你只是将哈希键传递给withPrimaryKey方法。

您似乎尝试一次删除多个项目。 DynamoDB无法做到这一点。您首先需要对密钥进行查询,然后可以将条件表达式应用于该表达式,以仅检索要删除的项的键。但是,您需要为每条记录单独调用delete API,或者使用批处理API批量删除记录,同时仍为每个项目指定哈希和范围键。