2015-07-06 2 views
0

У меня есть таблица с хешем и первичным ключом диапазона. Мне нужно запросить eventDate и customerId. Вот структура. Хэш является уникальным идентификатором в формате UUID, диапазон - customerId. Также у меня есть LSI с ключом event event. Я хочу, чтобы сделать запрос с парами:DynamoDB как запросить только по диапазону?

'KeyConditionExpression' => "customerId = :customer_id"

Но я получил ошибку:

Query condition missed key schema element: uniqueId

Вы можете сказать, что я не должен использовать бесполезные хэш, но то, что я должен делать? До этого я пытался использовать hash и range customerId, eventDate, но я не смог их использовать, так как не гарантирует, что eventDate будет уникальным. Это означает, что одновременно генерировались три события, а затем сохранялся только последний.

Есть ли способ объединить такую ​​структуру с dynamodb?

ответ

1

Вы можете выполнить одно из следующих действий:

  1. Make ID клиента, как HashKey и UUID как RangeKey. Затем LSI будет определяться на CustomerID и EventDate. Вы можете найти таблицу на БИС следующим образом:

    // Using DynamoDBMapper in AWS SDK Java 
    DynamoDBQueryExpression<YourClass> query = 
        new DynamoDBQueryExpression<YourClass>(); 
    YourClass hashKeyValues = new YourClass(); 
    hashKeyValues.setCustomerId(customerId); 
    
    Map<String, Condition> rangeKeyConditions = 
        new HashMap<String, Condition>(); 
    rangeKeyConditions.put("EventDate", 
        new Condition() 
         .withConditionalOperator(ConditionalOperator.EQ) 
         .withAttributeValue(new AttributeValue(eventDate))); 
    
    query.setHashKeyValues(hashKeyValues); 
    query.setRangeKeyConditions(rangeKeyConditions); 
    query.setIndexName(LSI_CUSTOMER_ID_EVENT_DATE); 
    // Execute the query using DynamoDBMapper. 
    
  2. Создание глобального Secondary Index (GSI) на CustomerID как HashKey и EVENTDATE как RangeKey в GSI.

    // Using DynamoDBMapper in AWS SDK Java 
    DynamoDBQueryExpression<YourClass> query = 
        new DynamoDBQueryExpression<YourClass>(); 
    YourClass hashKeyValues = new YourClass(); 
    hashKeyValues.setCustomerId(customerId); 
    
    Map<String, Condition> rangeKeyConditions = 
        new HashMap<String, Condition>(); 
    rangeKeyConditions.put("EventDate", 
        new Condition() 
         .withConditionalOperator(ConditionalOperator.EQ) 
         .withAttributeValue(new AttributeValue(eventDate))); 
    
    query.setHashKeyValues(hashKeyValues); 
    query.setRangeKeyConditions(rangeKeyConditions); 
    query.setIndexName(GSI_CUSTOMER_ID_EVENT_DATE); 
    // Execute the query using DynamoDBMapper. 
    

Вы можете быть осведомлены о стоимости использования GSI, если вы не можете проверить GSI documentation раз.

HTH.

Смежные вопросы