NodeJS 在dynamodb Local中查询全局辅助索引

jhdbpxl9  于 2023-01-12  发布在  Node.js
关注(0)|答案(7)|浏览(217)

我正在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' } } }

但我一直收到错误消息
“验证异常:一个或多个参数值无效:条件参数类型与架构类型””不匹配
在文档中,它指定主KeyType可以是HASHRANGE,并且您在AttributeDefinitions字段中设置AttributeType。我将publisherId作为String发送,不确定我在这里遗漏了什么。
问题出在创建表的方式上,还是出在查询的方式上?谢谢

wa7juj8i

wa7juj8i1#

尝试更改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天的时间为这个。官方文件在误导。

b09cbbtk

b09cbbtk2#

事实证明,这取决于您使用的是AWS.DynamoDB还是AWS.DynamoDB.DocumentClient
检查文档中的差异:AWS动态数据库查询与AWS动态数据库文档客户端查询
在DocumentClient中,文档明确指出:
文档客户端通过抽象属性值的概念简化了Amazon DynamoDB中项目的处理,这种抽象注解了作为输入参数提供的原生JavaScript类型,并将注解的响应数据转换为原生JavaScript类型。
...
提供与AWS.DynamoDB.query()相同的参数,但AttributeValues由原生JavaScript类型替换。
也许您还参考了API参考,它实际上没有对所使用的SDK做出任何假设,而是在示例中使用了普通的HTTP请求。
因此,使用AWS.DynamoDB.DocumentClient时,您只需按照@gior91的建议为ExpressionAttributeValues提供一个简单的键值Map。

1u4esq0p

1u4esq0p3#

如上所述,如果您希望去除类型转换,则需要使用DynamoDB文档客户端。

var docClient = new AWS.DynamoDB.DocumentClient();

...那么您就可以使用上面列出的对象表示法来调用API。

{ ':pub_id': '700'}

我自己也遇到过这个问题,我在一些地方使用DynamoDB(),在另一些地方使用docClient,一时想不通,但这会解决它。

gjmwrych

gjmwrych4#

我发现其他答案非常有用,但我 * 仍然 * 无法让ValidationException消失...最终我意识到我一直在使用DocumentClient.get,而不是.query🤦
(从技术上讲,这不是问题的答案,但在这里发布,而不是在评论中,以使它更容易被其他任何人看到这样一个奇妙的无益的错误消息。)

zed5wv10

zed5wv105#

也许我迟到了,但我想分享一个方法,将保证正确的查询参数。
所以,
1.转到你的aws控制台,选择dynamodb服务,
1.在左边,这是dynamodb菜单,点击"浏览项目".
1.然后,选择您感兴趣的表。
1.选择表格后,右侧顶部显示"扫描/查询项目",请展开
1.选择"查询"选项卡,然后在下拉列表中选择您的索引
1.然后输入一个值,点击"运行"按钮
1.注意:在chrome的网络中,"Fetch/XHR"选项卡会显示一个http请求,请看payload,是你需要的查询,当然你可以尝试去掉一些不需要的字段,比如"Limit"
1.如何使用查询参数await documentClient.query(params).promise();
如果你还不明白,请看下面的截图:

2uluyalo

2uluyalo6#

从技术上讲,这并不是对所提问题的回答,但我将其张贴在这里,以使处理验证错误的其他人可以看到它。
我得到了“查询条件缺少关键架构元素id”ValidationError。
问题是我的QueryCommand缺少“IndexName”字段。添加后,命令工作了。
帮助我弄明白的是文档-https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#query-property

0sgqnhkj

0sgqnhkj7#

尝试将查询JSON替换为以下内容:

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

相关问题