Ste*_*vva 23 node.js amazon-dynamodb aws-sdk
我正在使用这些参数在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',
}
]
}
]
};
Run Code Online (Sandbox Code Playgroud)
我用这个查询这个表:
{ TableName: 'Configs',
IndexName: 'publisher_index',
KeyConditionExpression: 'publisherId = :pub_id',
ExpressionAttributeValues: { ':pub_id': { S: '700' } } }
Run Code Online (Sandbox Code Playgroud)
但我一直收到错误:
"ValidationException:一个或多个参数值无效:条件参数类型与模式类型不匹配"
在文档中,它指定主要KeyType可以是HASH或RANGE,并且您AttributeType在AttributeDefinitions字段中设置.我发送的publisherId是String,不知道我在这里缺少什么.
问题在于我创建表格的方式,还是我查询的方式?谢谢
gio*_*r91 72
试着改变这个
{
TableName: 'Configs',
IndexName: 'publisher_index',
KeyConditionExpression: 'publisherId = :pub_id',
ExpressionAttributeValues: { ':pub_id': { S: '700' } }
}
Run Code Online (Sandbox Code Playgroud)
在这
{
TableName: 'Configs',
IndexName: 'publisher_index',
KeyConditionExpression: 'publisherId = :pub_id',
ExpressionAttributeValues: { ':pub_id': '700'}
}
Run Code Online (Sandbox Code Playgroud)
从{ ':pub_id': { S: '700' } }到{ ':pub_id': '700'}.
我有同样的问题,我花了2天时间.误导性的官方文件.
The*_*ser 11
原来这取决于你是否使用AWS.DynamoDB或AWS.DynamoDB.DocumentClient.
检查文档中的差异: AWS.DynamoDB.query与 AWS.DynamoDB.DocumentClient.query
在DocumentClient中,doc明确指出:
文档客户端通过抽象出属性值的概念简化了在Amazon DynamoDB中处理项目的过程.此抽象注释作为输入参数提供的本机JavaScript类型,以及将带注释的响应数据转换为本机JavaScript类型.
...
提供与AWS.DynamoDB.query()相同的参数,其中AttributeValues由本机JavaScript类型替换.
也许您还指的是DynamoDB API Reference,它实际上不会对使用的SDK做出任何假设,而是在示例中使用纯HTTP请求.
因此,使用AWS.DynamoDB.DocumentClient你只需提供一个简单的键值映射,ExpressionAttributeValues如@ gior91所示.
小智 5
如上所述,如果要取消类型转换,则需要使用DynamoDB Document Client.
var docClient = new AWS.DynamoDB.DocumentClient();
Run Code Online (Sandbox Code Playgroud)
...然后你可以使用上面列出的对象表示法来调用API.
{ ':pub_id': '700'}
Run Code Online (Sandbox Code Playgroud)
我自己也遇到过这个问题,我在某些地方使用DynamoDB()而在其他地方使用docClient,暂时无法弄清楚,但这样就解决了.