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 в качестве параметра.