DynamoDB создает индекс на карте или типе списка

Я пытаюсь добавить индекс к атрибуту внутри объекта карты в DynamoDB и, похоже, не может найти способ сделать это. Это что-то, что поддерживается или индексы действительно разрешены только для скалярных значений? Документация вокруг этого кажется довольно скудной. Я надеюсь, что функция индексирования похожа на MongoDB, но до сих пор подходы, которые я использовал для привязки атрибута к индексу с использованием точечного синтаксиса, не были успешными. Любая помощь или дополнительная информация, которые могут быть предоставлены, оценены.

Ответы

Ответ 1

Индексы могут быть созданы только для атрибутов JSON верхнего уровня. Кроме того, ключи диапазона должны быть скалярными значениями в DynamoDB (один из String, Number, Binary или Boolean).

Из http://aws.amazon.com/dynamodb/faqs/:

Q: Является ли запрос JSON-данных в DynamoDB другим?

Нет. Вы можете создать глобальный вторичный индекс или локальный вторичный индекс на любой элемент JSON верхнего уровня. Например, предположим, что вы сохранили JSON документ, содержащий следующую информацию о человеке: Имя, фамилия, почтовый индекс и список всех их друзей. Имя, фамилия и почтовый индекс будут элементами верхнего уровня JSON. Вы можете создать индекс, который позволит вам запросить на основе имени, последнего Имя или почтовый индекс. Список друзей не является элементом верхнего уровня, поэтому вы не можете индексировать список друзей. Чтобы получить больше информации о глобальном вторичном индексировании и его возможностях запросов, см. Secondary Indexes в этом FAQ.

Q: Какие типы данных могут быть проиндексированы?

Все типы скалярных данных (Number, String, Binary и Boolean) могут быть используется для ключевого элемента диапазона локального вторичного индексного ключа. Задавать, список и типы карт не могут быть проиндексированы.

Ответ 2

Я пытался сделать хэш (str (объект)), пока я храню объект отдельно. Этот хеш дает мне целое число (Number), и я могу использовать вторичный индекс для него. Ниже приведен пример в Python, важно использовать хеш-функцию, которая каждый раз генерирует один и тот же хеш-ключ для значения. Поэтому я использую sha1.

# Generate a small integer hash:
import hashlib
def hash_8_digits(source):
    return int(hashlib.sha1(source.encode()).hexdigest(), 16) % (10 ** 8)

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