DynamoDB " или " запрос условного диапазона


Предположим, что моя таблица выглядит следующим образом:

Code    |StartDate  |EndDate    |Additional Attributes...

ABC     |11-24-2015 |11-26-2015 | ....

ABC     |12-12-2015 |12-15-2015 | ....

ABC     |10-05-2015 |10-10-2015 | ....

PQR     |03-24-2015 |03-27-2015 | ....

PQR     |05-04-2015 |05-08-2015 | ....

При условии кода (c) и диапазона дат (x, y), мне нужно иметь возможность запрашивать элементы примерно так:

Query => (Code = c) AND ((StartDate BETWEEN x AND y) OR (EndDate BETWEEN x AND y))

Я планировал использовать первичный ключ в качестве хэша и ключа диапазона (Code, StartDate) с дополнительным LSI (EndDate) и сделать запрос на него. Я не уверен, есть ли способ достичь этого. Я не хочу использовать операцию SCAN, поскольку она, похоже, сканирует всю таблицу, что может быть очень дорого.

Также, хотел бы достичь это в одном запросе.

1 2

1 ответ:

Одним из вариантов было бы сделать это с помощью QUERY и FilterExpression. Нет необходимости определять LSI в этом случае. Вам нужно будет выполнить запрос по Hash Key с помощью оператора EQ, а затем сузить результаты с помощью выражения фильтра. Вот пример с Java SDK:

Table table = dynamoDB.getTable(tableName);

Map<String, Object> expressionAttributeValues = new HashMap<String, Object>();
expressionAttributeValues.put(":x", "11-24-2015");
expressionAttributeValues.put(":y", "11-26-2015");

QuerySpec spec = new QuerySpec()
    .withHashKey("Code", "CodeValueHere")
    .withFilterExpression("(StartDate between :x and :y) or (EndDate between :x and :y)")
    .withValueMap(expressionAttributeValues);


ItemCollection<QueryOutcome> items = table.query(spec);

Iterator<Item> iterator = items.iterator();

while (iterator.hasNext()) {
    System.out.println(iterator.next().toJSONPretty());
}

Смотрите Задание условий с помощью выражений условий для получения более подробной информации.

Кроме того, хотя предыдущий запрос использует только Hash Key, вы все еще можете группировать записи с помощью Range Key, содержащего даты в следующем формате:

StartDate#EndDate

Структура Таблицы:

Code    DateRange             |StartDate  |EndDate        
ABC     11-24-2015#11-26-2015 |11-24-2015 |11-26-2015  

ABC     12-12-2015#12-15-2015 |12-12-2015 |12-15-2015

ABC     10-05-2015#10-10-2015 |10-05-2015 |10-10-2015

PQR     03-24-2015#03-27-2015 |03-24-2015 |03-27-2015

PQR     05-04-2015#05-08-2015 |05-04-2015 |05-08-2015

Таким образом, если вы запросите только по Hash Key, вы все равно получите записи, отсортированные по датам. Кроме того, я считаю, что это хорошая идея, чтобы следовать совету, данному об однозначной дате format.nu