Чи можна ЗАМОВИТИ результати за допомогою API запитів або сканування в DynamoDB?
Мені потрібно знати, чи DynamoDB має щось на зразок [ORDER BY 'field'] із запитів SQL?
Дякую.
Чи можна ЗАМОВИТИ результати за допомогою API запитів або сканування в DynamoDB?
Мені потрібно знати, чи DynamoDB має щось на зразок [ORDER BY 'field'] із запитів SQL?
Дякую.
Відповіді:
Не явно, однак, замовлення, очевидно, потрібне для багатьох справжніх випадків використання, і його можна змоделювати за допомогою первинного ключа хешу та діапазону відповідно:
У цьому випадку первинний ключ складається з двох атрибутів. Перший атрибут - це атрибут хешу, а другий - атрибут діапазону. Amazon DynamoDB створює невпорядкований хеш-індекс на атрибуті хеш-первинного ключа та відсортований індекс діапазону на атрибуті первинного ключа діапазону . [курсив мій]
Потім ви можете використовувати цей індекс діапазону для необов’язкового запиту елементів через параметр RangeKeyCondition параметра API запиту та вказівки обходу індексу вперед або назад (тобто напрямок сортування) за допомогою параметра ScanIndexForward .
Оновлення: Ви можете впорядкувати за атрибутом із локальним вторинним індексом таким же чином.
Ви можете використовувати клавішу сортування та застосувати параметр ScanIndexForward у запиті для сортування у порядку зростання або зменшення. Тут я обмежую елементи, що повертаються до 1.
var params = {
TableName: 'Events',
KeyConditionExpression: 'Organizer = :organizer',
Limit: 1,
ScanIndexForward: false, // true = ascending, false = descending
ExpressionAttributeValues: {
':organizer': organizer
}
};
docClient.query(params, function(err, data) {
if (err) {
console.log(JSON.stringify(err, null, 2));
} else {
console.log(JSON.stringify(data, null, 2));
}
});
Використовуйте ScanIndexForward (true для зростання та false для спадання), а також можете обмежити результат, використовуючи значення setLimit значення виразу запиту.
Нижче наведено код, де використовується QueryPage для пошуку окремого запису.
public void fetchLatestEvents() {
EventLogEntitySave entity = new EventLogEntitySave();
entity.setId("1C6RR7JM0JS100037_contentManagementActionComplete");
DynamoDBQueryExpression<EventLogEntitySave> queryExpression = new DynamoDBQueryExpression<EventLogEntitySave>().withHashKeyValues(entity);
queryExpression.setScanIndexForward(false);
queryExpression.withLimit(1);
queryExpression.setLimit(1);
List<EventLogEntitySave> result = dynamoDBMapper.queryPage(EventLogEntitySave.class, queryExpression).getResults();
System.out.println("size of records = "+result.size() );
}
@DynamoDBTable(tableName = "PROD_EA_Test")
public class EventLogEntitySave {
@DynamoDBHashKey
private String id;
private String reconciliationProcessId;
private String vin;
private String source;
}
public class DynamoDBConfig {
@Bean
public AmazonDynamoDB amazonDynamoDB() {
String accesskey = "";
String secretkey = "";
//
// creating dynamo client
BasicAWSCredentials credentials = new BasicAWSCredentials(accesskey, secretkey);
AmazonDynamoDB dynamo = new AmazonDynamoDBClient(credentials);
dynamo.setRegion(Region.getRegion(Regions.US_WEST_2));
return dynamo;
}
@Bean
public DynamoDBMapper dynamoDBMapper() {
return new DynamoDBMapper(amazonDynamoDB());
}
}
Іншим варіантом, який повинен вирішити проблему, є
Це дозволить сортувати будь-яке значення вашої таблиці за необхідності. Це дуже ефективний спосіб знайти найвищі позиції у вашій таблиці без необхідності отримувати весь запит, а потім фільтрувати його потім.
Якщо ви використовуєте boto2 і у вас є ключ сортування в одному зі стовпців у вашій таблиці, ви можете сортувати те, що ви отримуєте, по порядку або в зворотному порядку, сказавши:
result = users.query_2(
account_type__eq='standard_user',
reverse=True)
Якщо ви використовуєте boto3 і у вас у стовпці є ключ сортування, за яким ви хочете відсортувати результат, ви можете сортувати отримані дані, сказавши:
result = users.query(
KeyConditionExpression=Key('account_type').eq('standard_user'),
ScanIndexForward=True)
Пам’ятайте, що у файлі boto3 значення ScanIndexForward є істинним, DynamoDB повертає результати в тому порядку, в якому вони зберігаються (за значенням ключа сортування). Це поведінка за замовчуванням. Якщо ScanIndexForward хибне, DynamoDB зчитує результати у зворотному порядку за значенням ключа сортування, а потім повертає результати клієнту.
Якщо таблиця вже існувала, додайте GSI (Глобальний вторинний індекс) до атрибута, який потрібно для таблиці, і використовуйте Query, а не Scan. Якщо ви збираєтеся створити таблицю, ви можете додати LSI (Local Secondary Index) до потрібного атрибута.