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 ответ:
Одним из вариантов было бы сделать это с помощью
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