DynamoDB pagination - последний оцененный ключ не является нулевым - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь реализовать разбиение на страницы в DynamoDB с помощью Java SDK.

У меня есть простая модель данных с идентификатором HashKey и датой RangeKey.Я хочу запросить все даты после данной.Пока это работает, но проблема заключается в разбиении на страницы с использованием последнего оцененного ключа.

При запросе последней страницы lastEvaluatedKey не является нулевым, оно по-прежнему указывает на последний элемент последней запрошенной страницы.Другой запрос с этим ключом, установленным как èxclusiveStartKey, затем возвращает 0 результатов с null lastEvaluatedKey.

Мой код выглядит следующим образом:

var query = new DynamoDBQueryExpression<DynamoModel>();
var keyCondition = ImmutableMap.<String, AttributeValue>builder()
        .put(":v_userid", new AttributeValue().withS(userId))
        .put(":v_date", new AttributeValue().withS(date.toString()))
        .build();

if (!StringUtils.isEmpty(lastKey)) {
    query.setExclusiveStartKey(ImmutableMap.<String, AttributeValue>builder()
            .put("userId", new AttributeValue().withS(userId))
            .put("date", new AttributeValue().withS(lastKey)).build());
}

query.withKeyConditionExpression("userId = :v_userid AND date >= :v_date");
query.withExpressionAttributeValues(keyCondition);
query.setLimit(2);

QueryResultPage<DynamoModel> resultPage = mapper.queryPage(DynamoModel.class, query);

Кто-нибудь знает, почемуlastEvaluatedKey не равно нулю при достижении последнего элемента, соответствующего KeyCondition?Когда я сохраняю только те элементы, которые соответствуют условию, LastEvaluatedKey является нулевым, как и ожидалось.

1 Ответ

0 голосов
/ 06 декабря 2018

Это ожидаемое поведение DynamoDB.

Если LastEvaluatedKey не пусто, это не обязательно означает, что в наборе результатов больше данных.Единственный способ узнать, когда вы достигли конца набора результатов, - это когда LastEvaluatedKey пусто.( source )

Это проектное решение AWS.Наиболее вероятное объяснение, которое я могу придумать, состоит в том, что для того, чтобы иметь LastEvaluatedKey, если есть больше элементов, они будут постоянно сканировать, чтобы найти больше элементов, и если вы используете выражение фильтра, им, возможно, придется сканироватьостальная часть раздела, чтобы определить, есть ли еще элементы.Это выбор, который помогает минимизировать задержку операции запроса (и сканирования).

...