我正在使用这些参数在DynamoDB中创建一个表和GSI,根据文档:
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
,并且您在AttributeType
字段中设置了AttributeDefinitions
。我发送的publisherId
为String
,不知道我在这里缺少什么。
问题在于我创建表格的方式,还是我查询的方式? 感谢
答案 0 :(得分:64)
尝试更改此
{
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天时间。有误导性的官方文件。
答案 1 :(得分:11)
原来这取决于您使用AWS.DynamoDB
还是AWS.DynamoDB.DocumentClient
。
检查文档中的差异: AWS.DynamoDB.query vs. AWS.DynamoDB.DocumentClient.query
在DocumentClient中,doc明确指出:
文档客户端通过抽象出属性值的概念,简化了在Amazon DynamoDB中处理项目的过程。此抽象注释作为输入参数提供的本机JavaScript类型,以及将带注释的响应数据转换为本机JavaScript类型。
...
提供与AWS.DynamoDB.query()相同的参数,其中AttributeValues由本机JavaScript类型替换。
也许您还指的是DynamoDB API Reference,它实际上对使用的SDK没有任何假设,但在示例中使用了普通的HTTP请求。
因此,使用AWS.DynamoDB.DocumentClient
,您只需按照@ gior91的建议为ExpressionAttributeValues
提供一个简单的键值映射。
答案 2 :(得分:5)
如上所述,如果您想要删除类型转换,则需要使用DynamoDB Document Client。
var docClient = new AWS.DynamoDB.DocumentClient();
...然后您可以使用上面列出的对象表示法来调用API。
{ ':pub_id': '700'}
我自己也遇到过这个问题,我在某些地方使用DynamoDB()而在其他地方使用docClient,暂时无法弄清楚,但这样就解决了。
答案 3 :(得分:0)
我发现其他答案非常有帮助,但我仍然无法让 ValidationException
消失...最终我意识到我一直在使用 {{ 1}} 的 DocumentClient
而不是 .get
?
(从技术上讲,这不是问题的答案,而是将其发布在这里而不是在评论中,以便让其他人在遇到如此非常无用的错误消息时更容易看到它。)
答案 4 :(得分:-2)
尝试用以下代码替换您的查询JSON:
{
TableName: 'Configs',
IndexName: 'publisher_index',
KeyConditionExpression: '#publisherId = :pub_id',
ExpressionAttributeNames: { '#publisherId': 'publisherId' },
ExpressionAttributeValues: { ':pub_id': { 'S': '700' } }
}