查询dynamodb Local中的全局二级索引

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可以是HASHRANGE,并且您AttributeTypeAttributeDefinitions字段中设置.我发送的publisherIdString,不知道我在这里缺少什么.

问题在于我创建表格的方式,还是我查询的方式?谢谢

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天时间.误导性的官方文件.

  • 这是因为当您使用`DocumentClient`时,您不再需要“S”来指示它是一个字符串。在底层,API 获取该数据,但“DocumentClient”在 Node.js 中将其从您手中抽象出来。https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html (3认同)

The*_*ser 11

原来这取决于你是否使用AWS.DynamoDBAWS.DynamoDB.DocumentClient.

检查文档中的差异: AWS.DynamoDB.queryAWS.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,暂时无法弄清楚,但这样就解决了.