DynamoDB: Предоставленный ключевой элемент не соответствует схеме
Мой вопрос о dynamodb
Есть способ получить элемент в зависимости от поля, которое не является hashkey?
Пример
Мои пользователи таблицы: id (HashKey) , name , email
И я хочу, чтобы пользователь получил электронную почту как "[email protected]"
Как это можно сделать?
Я пробую это с помощью boto:
user = users.get_item(email='[email protected]')
Я получаю следующую ошибку:
'The provided key element does not match the schema'
Ответы
Ответ 1
Для запроса по полям, которые не являются хэш-ключами, вам необходимо использовать глобальный вторичный индекс (GSI). Взгляните на эту страницу AWS для получения более подробной информации о GSI.
UPDATE Feb 2015: Теперь можно добавить GSI в существующую таблицу. Подробнее см. Amazon Docs.
<ы > К сожалению вы не можете добавить GSI в существующую таблицу DynamoDB, поэтому вам нужно будет создать новую таблицу и портировать ваши данные, если это действительно нужно для запроса.
Из FAQ DynamoDB:
В: Как создать глобальный вторичный индекс для таблицы DynamoDB?
Все GSI, связанные с таблицей, должны быть указаны при создании таблицы время. В настоящее время невозможно добавить GSI после таблицы был создан. Подробные инструкции по созданию таблицы и ее индексы, см. здесь. Вы можете создать максимум 5 глобальных вторичных индексов за стол.С >
Если вы не хотите переносить свои данные, вы можете подумать о создании второй таблицы DynamoDB с электронной почтой как хэш-ключ и хеш родительской записи, которая будет использоваться в качестве поиска в вашей основной таблице данных, но поскольку вы может представить, что это не совсем оптимальное решение, и оно имеет свои собственные головные боли, чтобы синхронизировать его с вашей главной таблицей.
Ответ 2
В AWM Lambda:
применяется следующее: Node.js AWS SDK:
Это было грубо для меня. Я столкнулся с этой проблемой при попытке использовать метод getItem. Независимо от того, что я пробовал, я буду продолжать получать эту ошибку. Я наконец нашел решение на форуме AWS: https://forums.aws.amazon.com/thread.jspa?threadID=208820
Необъяснимо, очевидное решение противоречит всей документации AWS, которую я могу найти.
Вот код, который работал у меня:
var doc = require('dynamodb-doc');
var dynamo = new doc.DynamoDB();
var params = { }
params.TableName = "ExampleTable";
var key = { "ExampleHashKey": "1" };
params.Key = key;
dynamo.getItem(params, function(err, data) {
if (err)
console.log(err);
else
console.log(data)
});
Ответ 3
Я также получил эту ошибку, когда я отправлял строку вместо целого числа.
Конечно, это было, когда я писал в базу данных, а не читал.
Ответ 4
Я получил эту ошибку на Java, потому что я использовал аннотацию @DynamoDBHashKey
для ключа RANGE. Я должен был использовать аннотацию @DynamoDBRangeKey
для моего идентификатора объекта.