Чтобы понять поведение, которое вы видели, вы должны понимать, что первоначальная цель LastEvaluatedKey
состояла не в том, чтобы сделать произвольный доступ к какому-либо месту в середине запроса так, как вы хотели его использовать, а скорее к возобновлению. запрос после того, как он остановился на границе страницы. Имея это в виду, когда ScanIndexForward=false
предполагает, что продолжает текущий обратный запрос;Поэтому, если вы передадите LastEvaluatedKey=5
, предполагается, что ранее возвращенная последовательность была 10, 9, 8, 7, 6, 5 (последний возвращенный элемент был 5) - так что теперь будет переходить к 4, 3, 2, 1. Точно так же, как выПримечание.
Если для ваших целей вам также необходим элемент «5», вы можете просто прочитать этот элемент отдельно в отдельном запросе. Это не будет стоить вам дороже, потому что Amazon выставляет вам счет по размеру прочитанного - это не дешевле, когда несколько предметов возвращаются в одном запросе. Также задержка не увеличится, если вы будете выполнять чтение и запрос параллельно.
Обновление:
Как заметил Чарльз в комментарии ниже, для коротких элементов и коротких страниц - дополнительный запрос GetItem«5» на самом деле будет стоить вам другого RCU, что может быть значительным, так что это не очень хорошая идея.
Так что есть еще один вариант, который вообще не использует LastEvaluatedKey
. Вместо этого Query
позволяет указать в KeyConditionExpression
не только нужный ключ раздела, но и диапазон ключей сортировки. Вы можете указать диапазон "sort <= 5", и это приведет к получению последней (когда ScanIndexForward = false) страницы элементов для сортировки <= 5 - включая 5. Я думаю, что это действительно даже лучшее решение, чем то, что я предложилвыше, потому что это не тратит впустую дополнительный RCU. </p>