В предыдущем посте мы приступили к вставке данных в базу данных DynamoDB.
В этом уроке мы выполним некоторые базовые запросы к нашим таблицам DynamoDB. Основное правило заключается в том, что каждый запрос должен использовать хеш-ключ.
Самая простая форма запроса использует только хеш-ключ. Мы запросим таблицу пользователей на этом. Будет только один результат, поэтому нет смысла перебирать список элементов.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
public Map<String,AttributeValue> getUser(String email) { Map<String,String> expressionAttributesNames = new HashMap<>(); expressionAttributesNames.put("#email","email"); Map<String,AttributeValue> expressionAttributeValues = new HashMap<>(); expressionAttributeValues.put(":emailValue",new AttributeValue().withS(email)); QueryRequest queryRequest = new QueryRequest() .withTableName(TABLE_NAME) .withKeyConditionExpression("#email = :emailValue") .withExpressionAttributeNames(expressionAttributesNames) .withExpressionAttributeValues(expressionAttributeValues); QueryResult queryResult = amazonDynamoDB.query(queryRequest); List<Map<String,AttributeValue>> attributeValues = queryResult.getItems(); if(attributeValues.size()>0) { return attributeValues.get(0); } else { return null; } } |
Однако мы можем выдавать более сложные запросы, используя условия .
Таблица логинов хорошо подходит для примера. Мы выдадим запрос, который будет получать попытки входа между датами.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
public List<Map<String ,AttributeValue>> queryLoginsBetween(String email, Date from, Date to) { List<Map<String,AttributeValue>> items = new ArrayList<>(); Map<String,String> expressionAttributesNames = new HashMap<>(); expressionAttributesNames.put("#email","email"); expressionAttributesNames.put("#timestamp","timestamp"); Map<String,AttributeValue> expressionAttributeValues = new HashMap<>(); expressionAttributeValues.put(":emailValue",new AttributeValue().withS(email)); expressionAttributeValues.put(":from",new AttributeValue().withN(Long.toString(from.getTime()))); expressionAttributeValues.put(":to",new AttributeValue().withN(Long.toString(to.getTime()))); QueryRequest queryRequest = new QueryRequest() .withTableName(TABLE_NAME) .withKeyConditionExpression("#email = :emailValue and #timestamp BETWEEN :from AND :to ") .withExpressionAttributeNames(expressionAttributesNames) .withExpressionAttributeValues(expressionAttributeValues); Map<String,AttributeValue> lastKey = null; do { QueryResult queryResult = amazonDynamoDB.query(queryRequest); List<Map<String,AttributeValue>> results = queryResult.getItems(); items.addAll(results); lastKey = queryResult.getLastEvaluatedKey(); } while (lastKey!=null); return items; } |
Имейте в виду, что DynamoDB извлекает данные на страницах, поэтому вы должны выполнять один и тот же запрос более одного раза в случае нескольких страниц. Поэтому вы должны использовать последний оцененный ключ для вашего следующего запроса.
Последний, но не менее важный запрос к индексам — это одно из основных действий. Это та же самая процедура для локальных или глобальных вторичных индексов.
Помните, что полученные результаты зависят от типа проекции, который мы указали при создании таблицы. В нашем случае тип проекции — для всех полей.
Мы будем использовать таблицу Супервизоров.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
public Map<String ,AttributeValue> getSupervisor(String company,String factory) { List<Map<String,AttributeValue>> items = new ArrayList<>(); Map<String,String> expressionAttributesNames = new HashMap<>(); expressionAttributesNames.put("#company","company"); expressionAttributesNames.put("#factory","factory"); Map<String,AttributeValue> expressionAttributeValues = new HashMap<>(); expressionAttributeValues.put(":company",new AttributeValue().withS(company)); expressionAttributeValues.put(":factory",new AttributeValue().withS(factory)); QueryRequest queryRequest = new QueryRequest() .withTableName(TABLE_NAME) .withKeyConditionExpression("#company = :company and #factory = :factory ") .withIndexName("FactoryIndex") .withExpressionAttributeNames(expressionAttributesNames) .withExpressionAttributeValues(expressionAttributeValues); QueryResult queryResult = amazonDynamoDB.query(queryRequest); List<Map<String,AttributeValue>> attributeValues = queryResult.getItems(); if(attributeValues.size()>0) { return attributeValues.get(0); } else { return null; } } |
Вы можете найти полный исходный код с юнит-тестами на github .
| Ссылка: | Запросите элементы DynamoDB с Java от нашего партнера по JCG Эммануила Гкациоураса в блоге gkatzioura . |