Вы правы.Чтобы отсортировать все точки данных по расстоянию от некоторого произвольного местоположения, необходимо прочитать все данные из таблицы DynamoDB.
В DynamoDB результаты можно сортировать только с использованием предварительно вычисленного значенияэто было сохранено в таблице DynamoDB и используется в качестве ключа сортировки таблицы или одного из ее индексов.Если вам нужно отсортировать по расстоянию от фиксированного местоположения, то вы можете сделать это с помощью DynamoDB.
Возможное решение (с ограничениями)
- TLDR; это не такая уж плохая проблема, если вы можете выбрать только сортировку элементов, которые находятся в пределах X км от произвольной точки.
Это все еще включает в себя сортировку точек данныхв памяти, но это облегчает проблему, давая неполные результаты (ограничивая максимальный диапазон результатов.)
Для этого вам понадобится геохэш вашей точки P (от которой вы измеряете расстояниеиз всех других пунктов).Предположим, что это A234311.Затем вам нужно выбрать, какой диапазон результатов подходит.Давайте добавим некоторые цифры, чтобы сделать это конкретным.(Я полностью придумываю эти числа, потому что действительные числа не имеют значения для понимания концепций.)
A - represents a 6400km by 6400km area
2 - represents a 3200km by 3200km area within A
3 - represents a 1600km by 1600km area within A2
4 - represents a 800km by 800km area within A23
3 - represents a 400km by 400km area within A234
1 - represents a 200km by 200km area within A2343
1 - represents a 100km by 100km area within A23431
Графически это может выглядеть так:
View of A View of A23
|----------|-----------| |----------|-----------|
| | A21 | A22 | | | |
| A1 |-----|-----| | A231 | A232 |
| | A23 | A24 | | | |
|----------|-----------| |----------|-----------|
| | | | |A2341|A2342|
| A3 | A4 | | A233 |-----|-----|
| | | | |A2343|A2344|
|----------|-----------| |----------|-----------| ... and so on.
В этом случаенаша точка P находится в A224132.Предположим также, что мы хотим получить отсортированные точки в пределах 400 км.A2343 имеет размер 400км на 400км, поэтому нам нужно загрузить результат с A2343 и всех его 8-связанных соседей (A2341, A2342, A2344, A2334, A2332, A4112, A4121, A4122).Затем, как только мы загрузим только те, которые находятся в памяти, вы вычисляете расстояния, сортируете их и отбрасываете результаты, которые превышают 400 км.
(Вы можете сохранить результаты, которые находятся на расстоянии более 400 км,поскольку пользователи / клиенты знают, что за пределами 400 км данные могут быть неполными.)
Метод хеширования, используемый библиотекой DynamoDB Geo, очень похож на Кривая Z-порядка - вы можете найтиполезно ознакомиться с этим методом, а также с Часть 1 и Часть 2 из блога базы данных AWS по индексированию Z-порядка для многогранных запросов в DynamoDB.