我正在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' } } }
但我一直收到错误消息
“验证异常:一个或多个参数值无效:条件参数类型与架构类型””不匹配
在文档中,它指定主KeyType
可以是HASH
或RANGE
,并且您在AttributeDefinitions
字段中设置AttributeType
。我将publisherId
作为String
发送,不确定我在这里遗漏了什么。
问题出在创建表的方式上,还是出在查询的方式上?谢谢
7条答案
按热度按时间wa7juj8i1#
尝试更改
ExpressionAttributeValues
到
从
{ ':pub_id': { S: '700' } }
到{ ':pub_id': '700'}
。我有同样的问题,我花了2天的时间为这个。官方文件在误导。
b09cbbtk2#
事实证明,这取决于您使用的是
AWS.DynamoDB
还是AWS.DynamoDB.DocumentClient
。检查文档中的差异:AWS动态数据库查询与AWS动态数据库文档客户端查询
在DocumentClient中,文档明确指出:
文档客户端通过抽象属性值的概念简化了Amazon DynamoDB中项目的处理,这种抽象注解了作为输入参数提供的原生JavaScript类型,并将注解的响应数据转换为原生JavaScript类型。
...
提供与AWS.DynamoDB.query()相同的参数,但AttributeValues由原生JavaScript类型替换。
也许您还参考了API参考,它实际上没有对所使用的SDK做出任何假设,而是在示例中使用了普通的HTTP请求。
因此,使用
AWS.DynamoDB.DocumentClient
时,您只需按照@gior91的建议为ExpressionAttributeValues
提供一个简单的键值Map。1u4esq0p3#
如上所述,如果您希望去除类型转换,则需要使用DynamoDB文档客户端。
...那么您就可以使用上面列出的对象表示法来调用API。
我自己也遇到过这个问题,我在一些地方使用DynamoDB(),在另一些地方使用docClient,一时想不通,但这会解决它。
gjmwrych4#
我发现其他答案非常有用,但我 * 仍然 * 无法让
ValidationException
消失...最终我意识到我一直在使用DocumentClient
的.get
,而不是.query
🤦(从技术上讲,这不是问题的答案,但在这里发布,而不是在评论中,以使它更容易被其他任何人看到这样一个奇妙的无益的错误消息。)
zed5wv105#
也许我迟到了,但我想分享一个方法,将保证正确的查询参数。
所以,
1.转到你的aws控制台,选择dynamodb服务,
1.在左边,这是dynamodb菜单,点击"浏览项目".
1.然后,选择您感兴趣的表。
1.选择表格后,右侧顶部显示"扫描/查询项目",请展开
1.选择"查询"选项卡,然后在下拉列表中选择您的索引
1.然后输入一个值,点击"运行"按钮
1.注意:在chrome的网络中,"Fetch/XHR"选项卡会显示一个http请求,请看payload,是你需要的查询,当然你可以尝试去掉一些不需要的字段,比如"Limit"
1.如何使用查询参数
await documentClient.query(params).promise();
如果你还不明白,请看下面的截图:
2uluyalo6#
从技术上讲,这并不是对所提问题的回答,但我将其张贴在这里,以使处理验证错误的其他人可以看到它。
我得到了“查询条件缺少关键架构元素id”ValidationError。
问题是我的QueryCommand缺少“IndexName”字段。添加后,命令工作了。
帮助我弄明白的是文档-https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#query-property
0sgqnhkj7#
尝试将查询JSON替换为以下内容: