Запрос глобального вторичного индекса в 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' } }
}