[英]Querying a Global Secondary Index in dynamodb Local
我根据文档使用这些参数在 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
,并且您在AttributeDefinitions
字段中设置了AttributeType
。 我将publisherId
作为String
发送,不确定我在这里遗漏了什么。
问题出在我创建表的方式上,还是我查询的方式上? 谢谢
尝试从此更改ExpressionAttributeValues
{
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 天时间。 官方文档中的误导。
事实证明,这取决于您是使用AWS.DynamoDB
还是AWS.DynamoDB.DocumentClient
。
检查文档中的差异: AWS.DynamoDB.query vs. AWS.DynamoDB.DocumentClient.query
在 DocumentClient 文档中明确指出:
文档客户端通过抽象出属性值的概念来简化对 Amazon DynamoDB 中项目的处理。 此抽象对作为输入参数提供的原生 JavaScript 类型进行注释,并将带注释的响应数据转换为原生 JavaScript 类型。
...
提供与 AWS.DynamoDB.query() 相同的参数,其中 AttributeValues 替换为原生 JavaScript 类型。
也许您还参考了DynamoDB API 参考,它实际上没有对使用的 SDK 做任何假设,而是在示例中使用纯 HTTP 请求。
因此,使用AWS.DynamoDB.DocumentClient
您只需按照 @gior91 的建议为ExpressionAttributeValues
提供一个简单的键值映射。
如上所述,如果您想消除类型转换,您需要使用 DynamoDB 文档客户端。
var docClient = new AWS.DynamoDB.DocumentClient();
...然后您可以使用上面列出的对象表示法来调用 API。
{ ':pub_id': '700'}
我自己遇到了这个问题,我在某些地方使用了 DynamoDB(),在其他地方使用了 docClient,暂时无法弄清楚,但这会解决它。
我发现其他答案非常有帮助,但我仍然无法让ValidationException
s消失......最终我意识到我一直在使用DocumentClient
的.get
而不是.query
🤦
(从技术上讲,这不是问题的答案,而是将其发布在此处而不是在评论中,以使其他人在遇到如此无益的错误消息时更容易看到它。)
也许我来晚了,但我想分享一个保证正确查询参数的方法。
所以,
await documentClient.query(params).promise();
从技术上讲,这不是所问问题的答案,但我将其张贴在这里是为了让处理验证错误的任何其他人都能看到它。
我收到“查询条件缺少关键架构元素 ID”ValidationError。
问题是我的 QueryCommand 缺少“IndexName”字段。 添加后,该命令起作用了。
帮助我弄明白的是文档 - https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#query-property
尝试用这个替换你的查询 JSON:
{
TableName: 'Configs',
IndexName: 'publisher_index',
KeyConditionExpression: '#publisherId = :pub_id',
ExpressionAttributeNames: { '#publisherId': 'publisherId' },
ExpressionAttributeValues: { ':pub_id': { 'S': '700' } }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.