2016-04-26 17 views
1

AWSのJava SDKを経由して、削除をしようとすると、私は提供重要な要素は、スキーマ(サービスと一致しないエラーAWS DynamoDBの削除

取得:AmazonDynamoDBv2;ステータスコード:400;エラーコードを:;:私はこの

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); 

のように見える定義された項目削除スペックを持っている52N303HS3D535K28KSN3R3803VVV4KQNSO5AEMVJF66Q9ASUAAJG)

ValidationExceptionは、IDをリクエストそして私のテーブルはこのように作成されました

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以外のタイムスタンプを指定する必要がありますか?

答えて

2

問題は、オブジェクトを削除するときにハッシュキーと範囲キーの両方を指定する必要があることです。ハッシュキーは "pk"で、範囲キーは "タイムスタンプ"ですが、ハッシュキーをwithPrimaryKeyメソッドに渡すだけです。

複数のアイテムを一度に削除しようとしているようです。これはDynamoDBでは不可能です。最初にキーのクエリを実行する必要があります。条件式を適用して、削除するアイテムのキーのみを取得することができます。ただし、レコードごとに個別にdelete APIを呼び出すか、バッチAPIを使用してバッチ内のレコードを削除し、各アイテムのハッシュと範囲キーを指定する必要があります。