Можно ли ЗАКАЗАТЬ результаты с помощью запроса или сканирования в DynamoDB? - PullRequest
62 голосов
/ 15 февраля 2012

Можно ли ЗАКАЗАТЬ результаты с помощью Query или Scan API в DynamoDB?

Мне нужно знать, есть ли у DynamoDB что-то вроде [ORDER BY 'field'] из запросов SQL?

Спасибо.

Ответы [ 5 ]

37 голосов
/ 15 февраля 2012

Не явно, однако, упорядочение очевидно необходимо для многих реальных случаев использования и может быть смоделировано с помощью Первичного ключа хеш-типа и диапазона значений соответственно:

В этом случае первичный ключ состоит из двух атрибутов. Первый Атрибуты - это атрибут хеша, а второй - это диапазон приписывать. Amazon DynamoDB строит неупорядоченный хеш-индекс на хеш атрибут первичного ключа и отсортированный по диапазону индекс диапазона ключевой атрибут . [Акцент мой]

Затем этот индекс диапазона можно использовать для необязательного запроса элементов с помощью параметра RangeKeyCondition API Query и указания прямого или обратного обхода индекса ( т.е. направление сортировки) через параметр ScanIndexForward .

Обновление: Вы можете упорядочить по атрибуту с локальным вторичным индексом таким же образом.

18 голосов
/ 27 апреля 2016

Вы можете использовать ключ сортировки и применить параметр 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));
    }
});
6 голосов
/ 29 мая 2017

Используйте 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());
    }
}
1 голос
/ 25 февраля 2019

Другой вариант, который должен решить проблему -

  1. Определите локальный вторичный индекс с помощью "обычного" хеш-ключа, который также будет хеш-ключом LSI
  2. Определите поле, которое вы хотите отсортировать как «Ключ сортировки» LSI
  3. Запросите LSI и установите желаемый порядок (см. Выше)

Это позволит сортировать любое значение вашей таблицы по мере необходимости. Это очень эффективный способ найти элементы таблицы с самым высоким рейтингом без необходимости получать весь запрос, а затем фильтровать его.

1 голос
/ 06 июля 2016

Если вы используете 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 имеет значение true, DynamoDB возвращает результаты в порядке их сохранения (по значению ключа сортировки). Это поведение по умолчанию. Если ScanIndexForward имеет значение false, DynamoDB считывает результаты в обратном порядке по значению ключа сортировки, а затем возвращает результаты клиенту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...