2016-04-26 3 views
1

При попытке сделать удалить с помощью AWS Java SDK Я получаю ошибкуAWS DynamoDB Удаление с помощью Java SDK

Указанный ключ элемент не соответствует схеме (Service: 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)); 

Мне интересно, вызывает ли этот ключ сортировки временную метку. Нужно ли указывать метку времени, отличную от> 0?

ответ

2

Проблема в том, что при удалении объекта необходимо указать как хэш, так и диапазон. Ваша хэш-клавиша - «pk», а ваш ключ диапазона - «timestamp», но вы передаете только хэш-ключ в метод withPrimaryKey.

Похоже, вы пытаетесь удалить сразу несколько элементов одновременно. Это невозможно с DynamoDB. Сначала вам нужно сделать запрос по ключу, и вы можете применить выражение условия к этому только для получения ключей элементов, которые хотите удалить. Тем не менее, вам тогда нужно будет вызывать API удаления отдельно для каждой записи или использовать пакетный API для удаления записей партиями, все еще указывая хэш и клавишу диапазона для каждого отдельного элемента.