GetItem из вторичного индекса с DynamoDB
Я только начинаю использовать DynamoDB и настраиваю таблицу "учетных записей".
Я установил дополнительный индекс, чтобы я мог запросить пользователя и пользовательский ключ api.
Ни одно из этих значений не является первичным ключом, так как они нестабильны и могут быть изменены.
Таблица построена с помощью
TableName: "Accounts",
KeySchema: [
{ AttributeName: "id", KeyType: "HASH" },
{ AttributeName: "email", KeyType: "RANGE" }
],
AttributeDefinitions: [
{ AttributeName: "id", AttributeType: "S" },
{ AttributeName: "email", AttributeType: "S" }
]
И индекс
TableName: 'Accounts',
AttributeDefinitions: [
{AttributeName: 'name', AttributeType: 'S'},
{AttributeName: 'apiKey', AttributeType: 'S'}
],
GlobalSecondaryIndexUpdates: [
{
Create: {
IndexName: "ApiAccounts",
ProvisionedThroughput: {
ReadCapacityUnits: 1, WriteCapacityUnits: 1
},
KeySchema: [
{AttributeName: 'name', KeyType: "HASH"},
{AttributeName: 'apiKey', KeyType: "STRING"}
],
Projection: {
ProjectionType: "KEYS_ONLY"
},
Теперь я пытаюсь получить учетную запись uses, запросив индекс ApiAccounts
.
Я пытаюсь
dynamoClient.get({
TableName: 'Accounts',
IndexName: 'ApiAccounts',
Key: {
name: nameKeyArray[0],
apiKey: nameKeyArray[1]
}, callback)
Но я получаю сообщение об ошибке One of the required keys was not given a value
, что заставляет меня поверить, что я не могу "получить" по индексу? Или я неправильно ссылаюсь на индекс. Может ли кто-нибудь уточнить для меня?
Имя и ключ API уникальны, поэтому я думаю, что хочу избежать запроса или сканирования, если возможно
Ответы
Ответ 1
Я думаю, это не так ясно из официальных документов. Вы можете выполнить операцию Scan
или Query
с индексом GSI
, но не операцию GetItem
.
Для каждой записи/элемента в Table
они должны иметь уникальные клавиши HASH
и RANGE
.
т.е.
// assume dummy api putItem(id, email, name, apiKey)
account.putItem("1", "[email protected]", "john", "key1") // OK
account.putItem("1", "[email protected]", "john", "key1") // NOT OK, id and email are table HASH and RANGE keys, must be unique
Но для Index
ключи Hash
и Range
не являются уникальными, они могут содержать дублированные записи/элементы.
т.е.
// assume dummy api putItem(id, email, name, apiKey)
account.putItem("1", "[email protected]", "john", "key1") // OK
account.putItem("1", "[email protected]", "john", "key1") // OK
т.е.
// assume dummy api putItem(id, email, name, apiKey)
account.putItem("1", "[email protected]", "john", "key1") // OK
account.putItem("2", "[email protected]", "john", "key1") // OK
Java
http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Index.html
Index
реализует QueryApi
и ScanApi
, но не GetItemApi
.
JavaScript
http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html#getItem-property
GetItem
не принимает IndexName
в качестве параметра.
http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html#query-property
Query
принимает IndexName
в качестве параметра.
http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html#scan-property
Scan
принимает IndexName
в качестве параметра.