Подтвердить что ты не робот

Возможны ли результаты ORDER с запросом или сканированием в DynamoDB?

Возможно ли получить результаты ORDER с помощью Query или Scan API в DynamoDB?

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

Спасибо.

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Вы можете использовать сортировку и применить параметр ScanIndexForward в query для сортировки в порядке возрастания или убывания. Здесь я ограничиваю элементы, возвращенные в 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));
    }
});

Ответ 3

Используйте 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());
    }
}

Ответ 4

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

Ответ 5

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

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

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