Почему DynamoDB LastEvaluatedKey зависит от предела запроса?

69
8

Использование javascript aws-sdk и запрос таблицы dynamodb с клиентом документа. таблица содержит 10 элементов, а предел запроса = 5.

Для каждого запроса я использую LastEvaluatedKey для создания нового запроса и отправки нового запроса, вот результаты:

first request --> {Items: Array(5), Count: 5, ScannedCount: 5, LastEvaluatedKey: {…}}
second request --> {Items: Array(5), Count: 5, ScannedCount: 5, LastEvaluatedKey: {…}}
third request --> {Items: Array(0), Count: 0, ScannedCount: 0}

Согласно этому документу

Если результат содержит элемент LastEvaluatedKey, перейдите к шагу 2. Если в результате нет LastEvaluatedKey, то больше нет элементов для извлечения

Он должен не возвращать LastEvaluatedKey во втором запросе, потому что больше нет элементов, но он возвращает тот, который отправляет пустой результат в третий запрос.

Когда я пытаюсь с ограничением = 4, все работает так, как ожидалось

first request --> {Items: Array(4), Count: 4, ScannedCount: 4, LastEvaluatedKey: {…}}
second request --> {Items: Array(4), Count: 4, ScannedCount: 4, LastEvaluatedKey: {…}}
third request --> {Items: Array(2), Count: 2, ScannedCount: 2} <--- there is no LastEvaluatedKey as expected

Так что здесь происходит?

спросил(а) 2018-08-05T12:34:00+03:00 2 года назад
1
Решение
67

Фактически я обнаружил, что это ожидаемый результат в соответствии с документом

LastEvaluatedKey

...

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

...

ответил(а) 2018-08-05T15:39:00+03:00 2 года назад
69

Ожидается то, что вы видите.

Это утверждение верно:

Если в результате нет LastEvaluatedKey, то больше нет элементов для извлечения

Тем не менее, вы предполагаете, что это подразумевает, что обратное условие также верно, но это не так...

Если больше не нужно извлекать элементы, то в результате #false не будет LastEvaluatedKey

Это не подразумевается первым утверждением, оно не является логически эквивалентным и не является истинным.

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

Если поиск достигнет цели, не дойдя до вашего предела, он не знает, что больше ничего не искать, поэтому он не возвращает LastEvaluatedKey.

ответил(а) 2018-08-05T15:44:00+03:00 2 года назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема