Подтвердить что ты не робот

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'
4b9b3361

Ответ 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 для моего идентификатора объекта.