Запрос глобального вторичного индекса в dynamodb Local

Я создаю таблицу и GSI в dynamo, используя эти параметры, согласно документации:

configId является основным ключом таблицы, и я использую publisherId как первичный ключ для GSI. (Я сократил некоторые ненужные параметры конфигурации для краткости)

var params = {
    TableName: 'Configs',
    KeySchema: [ 
        {
            AttributeName: 'configId',
            KeyType: 'HASH',
        }
    ],
    AttributeDefinitions: [
        {
            AttributeName: 'configId',
            AttributeType: 'S',
        },
        {
            AttributeName: 'publisherId',
            AttributeType: 'S',
        }
    ],
    GlobalSecondaryIndexes: [ 
        { 
            IndexName: 'publisher_index', 
            KeySchema: [
                {
                    AttributeName: 'publisherId',
                    KeyType: 'HASH',
                }
            ]
        }
    ]
};

Я запрашиваю эту таблицу, используя следующую команду:

{ TableName: 'Configs',
  IndexName: 'publisher_index',
  KeyConditionExpression: 'publisherId = :pub_id',
  ExpressionAttributeValues: { ':pub_id': { S: '700' } } }

но я продолжаю получать ошибку:   "ValidationException: одно или несколько значений параметра были недопустимыми: тип параметра условия не соответствует типу схемы"

В документах указывается, что первичный KeyType может быть HASH или RANGE, и что вы устанавливаете атрибутType в поле attributeDefinitions. Я отправляю publisherId как String, не уверен, что я здесь отсутствует.

Является ли проблема в способе создания таблицы или способа запроса? Благодаря

Ответ 1

Попробуйте изменить это

{ 
 TableName: 'Configs',
 IndexName: 'publisher_index',
 KeyConditionExpression: 'publisherId = :pub_id',
 ExpressionAttributeValues: { ':pub_id': { S: '700' } } 
}

в этом

{ 
 TableName: 'Configs',
 IndexName: 'publisher_index',
 KeyConditionExpression: 'publisherId = :pub_id',
 ExpressionAttributeValues: { ':pub_id': '700'} 
}

От { ':pub_id': { S: '700' } } до { ':pub_id': '700'}.

У меня была та же проблема, и я потратил на это 2 дня. Официальная документация вводит в заблуждение.

Ответ 2

Как указано выше, вам нужно использовать Клиент документов DynamoDB, если вы хотите отменить выдачу типа.

var docClient = new AWS.DynamoDB.DocumentClient();

... тогда вы можете просто использовать указанную выше номенклатуру объектов для вызова API.

{ ':pub_id': '700'}

Раньше в эту проблему, я использовал DynamoDB() в некоторых местах, а docClient в других, не мог понять это на некоторое время, но это решит.

Ответ 3

Оказывается, это зависит от того, используете ли вы AWS.DynamoDB или AWS.DynamoDB.DocumentClient.

Проверьте разницу в документации: AWS.DynamoDB.query против. AWS.DynamoDB.DocumentClient.query

В DocumentClient документ четко заявляет:

Клиент документа упрощает работу с элементами в Amazon DynamoDB, абстрагируя понятие значений атрибутов. Эта абстракция аннотирует родные типы JavaScript, поставляемые в качестве входных параметров, а также преобразует аннотированные данные ответа в собственные типы JavaScript.

...

Поставляйте те же параметры, что и AWS.DynamoDB.query(), с атрибутами AttributeValues, замененными родными типами JavaScript.

Возможно, вы также ссылаетесь на Справочник по DynamoDB API, который на самом деле не делает предположений о используемом SDK, но использует простые HTTP-запросы в примеры.

Таким образом, используя AWS.DynamoDB.DocumentClient, вы просто предоставили бы просто карту ключевых значений для ExpressionAttributeValues, как это было предложено @gior91.

Ответ 4

Попробуйте заменить запрос JSON следующим:

{
  TableName: 'Configs',
  IndexName: 'publisher_index',
  KeyConditionExpression: '#publisherId = :pub_id',
  ExpressionAttributeNames: { '#publisherId': 'publisherId' },
  ExpressionAttributeValues: { ':pub_id': { 'S': '700' } }
}