java - AWS DynamoDB 通过 Java SDK 删除

标签 java amazon-web-services amazon-dynamodb

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

The provided key element does not match the schema (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request 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));

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

最佳答案

问题是您在删除对象时必须同时指定散列键和范围键。您的散列键是“pk”,您的范围键是“时间戳”,但您只是将散列键传递给 withPrimaryKey 方法。

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

关于java - AWS DynamoDB 通过 Java SDK 删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36868773/

相关文章:

java - 使用 java 在 SNS 主题上出现 InvalidParameterException

java - 如果没有 "if"大小写匹配,则在开头设置默认值或显式设置

amazon-web-services - CognitoCachingCredentialsProvider (Android) - 如何注销和删除缓存的凭据

amazon-web-services - Maven 无法从链中的任何提供商加载 AWS 凭证

api - 是否可以使用 aws api 网关进行相互身份验证?

python - 在 Python 中使用 boto.dynamodb2 在 AWS DynamoDb 中增加计数器

Java以指数格式输出 double

java - 从 jmap 获取永久空间

javascript - 请求中包含的安全 token 无效。 AWS 开发工具包

go - 使用 Go SDK,如何将 DynamoDB 表项字段设置为 map ?