2016-03-08 3 views
3

Я ищу запрос на базе Dynamo DB без HashKey. Я пробовал использовать сканирование, но это дорого, поэтому мы искали другие альтернативы.Запрос в Dynamo DB без hashkey или сканирование

+0

Просьба предоставить некоторые данные образца и ваш желаемый результат. (См. [How to формат SQL-таблиц в переполнении стека post?] (Http://meta.stackexchange.com/q/96125) о том, как добавить некоторые.) Дополнительная схема информация, где ваши попытки не удались, также помогите нам помочь вам лучше. – Raju

+0

Пробовал вот так: filter.put ("id", new Condition(). WithComparisonOperator (ComparisonOperator.EQ) .withAttributeValueList (новый AttributeValue(). WithS (id))); scanExpression.setScanFilter (фильтр); \t \t \t // TableNamess - это имя таблицы list = dynamoDBMapper.scan (TableNamess.class, scanExpression, dynamoDBOperations.getTableNameOverride (tableName)); – Mridul

+0

Пожалуйста, обновите вопрос, нажав ссылку [edit] (http://stackoverflow.com/posts/35861013/edit), которая доступна чуть ниже вашего содержимого вопроса. Вопрос позволяет много возможностей форматирования, кроме комментариев. – Raju

ответ

14

Начну с того, что запрос таблицы DynamoDB без знания хэш-ключа не может быть выполнен. И это имеет смысл.

Теперь, нужен ли хэш-ключ, который вы хотите использовать, - это первичный ключ таблицы или нет, зависит от вас.

Предположим, например, что у вас есть следующая таблица:

╔══════════════════════╦════════════════════════╦════════════════╗ 
║ course_id (Hash Key) ║  course_name  ║ teacher  ║ 
╠══════════════════════╬════════════════════════╬════════════════╣ 
║ 324234    ║ Node.js for Dummies ║ Ryan Dahl  ║ 
║ 213323    ║ How to train your cat ║ Jackson Galaxy ║ 
║ 324090    ║ Cat Logic    ║ Jackson Galaxy ║ 
║ 763298    ║ Diving into .NET  ║ Eric Lippert ║ 
╚══════════════════════╩════════════════════════╩════════════════╝ 

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

Но, если мы хотим получить Все курсы, которые преподаёт Jackson Galaxy?

Мы не знаем course_id этих курсов, это то, что мы хотим получить. Таким образом, мы оказываемся без знания значений хэш-элементов элементов.

Здесь GSI Вступить в игру. Глобальные вторичные индексы позволяют определить другой хеш-ключ для вашей таблицы. Обратите внимание, что он не изменит основной хеш-ключ - course_id все равно будет хэш-ключ таблицы.

GSI предоставляет дополнительный хеш-ключ, позволяющий выполнять более сложные запросы.

Допустим, мы добавим GSI по имени teacher_index, и мы говорим, что teacher будет наш хэш-ключ, и course_id будет наш ключевой диапазон (Нам нужно указать ключ диапазона, потому что teacher отдельно в качестве хэш-ключа будет генерировать дубликат записей).

Теперь мы можем запросить наш teacher_index и передать в Jackson Galaxy как значение ключа хэша. Результатом будет 213323 - How to train your cat и 324090 - Cat Logic.

+0

Спасибо за очень простой и понятный ответ. –

+0

Хороший ответ. Но разве это не подчеркивает ограничение dynamodb? В mongodb нет необходимости указывать явные индексы для того, что вы хотите запросить. Я просто пытаюсь понять различия здесь. – Phil

+0

Отличный ответ, помогите мне понять концепцию GSI, но предположим, что я хочу создать функцию поиска для учителей, как я могу пользователь 'contains', если учителем является hash_key? – agmezr

0

Я частично согласен с ответом, опубликованным Матиасом. Вы можете создать глобальный вторичный индекс в таблице (с хеш-ключом и опционный ключ диапазона).

Я не согласен с тем, что он говорит в своем ответе позже: «Нам нужно указать ключ диапазона, потому что только учитель как хэш-ключ будет генерировать повторяющиеся записи». Я не могу прокомментировать его ответ, потому что у меня недостаточно репутации. По какой-то причине я не могу отредактировать его ответ.

Из AWS docs:

Глобальные вторичные индексы не обеспечения уникальности

Следовательно, диапазон ключей для глобальных вторичных индексов (GSI в) являются необязательными и составной ключ для GSI не нужно однозначно идентифицировать любую запись.

Смежные вопросы