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

时间:2015-11-21 19:11:30

标签: 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',
                }
            ]
        }
    ]
};

我使用这个查询此表:

{ TableName: 'Configs',
  IndexName: 'publisher_index',
  KeyConditionExpression: 'publisherId = :pub_id',
  ExpressionAttributeValues: { ':pub_id': { S: '700' } } }

但我一直收到错误:

  

“ValidationException:一个或多个参数值无效:条件参数类型与架构类型不匹配”

在文档中,它指定主要KeyType可以是HASHRANGE,并且您在AttributeType字段中设置了AttributeDefinitions。我发送的publisherIdString,不知道我在这里缺少什么。

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

5 个答案:

答案 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' } }
}