it-swarm.com.ru

DynamoDB: предоставленный ключевой элемент не соответствует схеме

Есть ли способ получить элемент в зависимости от поля, которое не является хеш-ключом?

Пример

Пользователи моей таблицы: id (HashKey), name, email

И я хочу получить пользователя с электронной почтой как «[email protected]»

Как это можно сделать?

Я пытаюсь это с Бото:

user = users.get_item(email='[email protected]')

Я получаю следующую ошибку: 

'The provided key element does not match the schema'
26
Houssam Hsm

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

ОБНОВЛЕНИЕ Февраль 2015: Теперь возможно добавить GSI в существующую таблицу. Смотрите Amazon Docs для более подробной информации.

К сожалению вы не можете добавить GSI к существующей таблице DynamoDB поэтому вам нужно будет создать новую таблицу и перенести ваши данные, если это то, что вам действительно нужно запросить.

Из DynamoDB FAQ :

Q: Как создать глобальный вторичный индекс для таблицы DynamoDB?

Все GSI, связанные с таблицей, должны быть указаны при создании таблицы время. В настоящее время невозможно добавить GSI после таблицы был создан. Для подробных шагов по созданию таблицы и ее индексы, см. здесь . Вы можете создать максимум 5 глобальных вторичных индексы на таблицу . </ S>

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

12
Wolfwyrd

Следующее применимо к AWS SDK Node.js в среде AWS Lambda:

Это было грубо для меня. Я столкнулся с этой проблемой при попытке использовать метод 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)
});
18
Sean

Я также получил эту ошибку, когда отправлял строку вместо целого числа.

Конечно, это было, когда я писал в базу данных, а не читал из.

8
NotoriousWebmaster

Я получил эту ошибку в Java, потому что я использовал аннотацию @DynamoDBHashKey для ключа RANGE. Вместо этого мне пришлось использовать аннотацию @DynamoDBRangeKey для идентификатора моего объекта.

0
Ryan Shillington