在 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:一个或多个参数值无效:条件参数类型与架构类型不匹配”

In the docs it specifies that the primary KeyType can either be HASH or RANGE , and that you set the AttributeType in the AttributeDefinitions 字段。我正在发送 publisherId 作为 String ,不确定我在这里缺少什么。

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

原文由 Stelios Savva 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 629
2 个回答

尝试从这里更改 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 天时间。官方文档中的误导。

原文由 gior91 发布,翻译遵循 CC BY-SA 4.0 许可协议

事实证明,这取决于您使用的是 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 您只需为 ExpressionAttributeValues 提供一个简单的键值映射,正如 @gior91 所建议的。

原文由 TheWebweiser 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题