繁体   English   中英

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

[英]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可以是HASHRANGE ,并且您在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 🤦

(从技术上讲,这不是问题的答案,而是将其发布在此处而不是在评论中,以使其他人在遇到如此无益的错误消息时更容易看到它。)

也许我来晚了,但我想分享一个保证正确查询参数的方法。

所以,

  1. go 到您的 aws 控制台,select dynamodb 服务,
  2. 在左侧,它是 dynamodb 菜单,然后单击“Explore items”。
  3. 然后,选择您感兴趣的表。
  4. 选择表格后,在右侧,顶部将显示“扫描/查询项目”。 请展开
  5. 选择“查询”选项卡,然后在下拉列表中输入 select 您的索引
  6. 然后,输入一个值,然后单击“运行”按钮
  7. 注意:在 chrome 的 .network 中,“Fetch/XHR”选项卡将显示 http 请求。 请查看有效载荷。 这是您需要的查询。 当然,你可以尝试去掉一些你不需要的字段,比如“Limit”
  8. 如何使用查询参数? 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM