Статьи

Запрос элементов DynamoDB с помощью Java

В предыдущем посте мы приступили к вставке данных в базу данных 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 .