node.js - 如何使用 KeyConditionExpression 查询 AWS DynamoDb?
问题描述
我有一个 AWS DynamoDb 表,
我有 user_id 作为索引或 GSI(user_id-index),
并且我有 product_type 也作为索引或 GSI(prod_type-index)。
我正在尝试使用 KeyConditionExpression 来查询 DynamoDb 表,
但我得到了 -
Validation Exception, with message:"Query key condition not supported" and statusCode: 400
ValidationException: Query key condition not supported\n at Request.extractError
我在桌子上有以下项目结构 -
{
"id": "12345f9f-f08c-45ae-986a-f1b5ac712345",
"user_id": 1234,
"prod_type": "OTHER"
}
以下是我用于查询表的 NodeJs 代码 -
let AWS = require('aws-sdk');
AWS.config.update({
region: 'us-east-1'
});
let connection = new AWS.DynamoDB.DocumentClient();
let table = "some_table";
let params = {
IndexName : "user_id-index",
ExpressionAttributeValues: {
":v1": {
N: 1234
},
":v2": {
S: "OTHER"
}
},
ExpressionAttributeNames: {
"#userId": "user_id",
"#prodType": "prod_type"
},
TableName: table,
KeyConditionExpression: "#userId = :v1 and #prodType = :v2"
};
connection.query(params, function(err, data) {
if (err) {
console.log(err);
} else {
console.log(data);
}
});
参考 -
Dynamodb 查询错误 - 不支持查询键条件
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.KeyConditions.html
解决方案
正如我在上一个答案中提到的。您不能将一个 GSI/Primary 的哈希键和另一个 GSI/Primary 的哈希键放在一个KeyConditionExpression
条件必须对单个分区键值执行相等测试 。
该条件可以选择对单个排序键值执行多个比较测试之一。这允许 Query 检索具有给定分区键值和排序键值的一个项目,或者检索具有相同分区键值但不同排序键值的多个项目。
DynamoDB 不支持它,它实际上是为了省钱。您可以在这里做的是使用更具体的 GSI 哈希键作为 KeyConditionExpression 然后您可以对结果集执行 FilterExpression
否则,设置一个 GSI,其中一个属性作为哈希键,另一个作为范围键。这样您就可以使用语法进行查询
partitionKeyName = :partitionkeyval AND sortKeyName = :sortkeyval
请记住 partitionKeyName 仅支持相等。sortKeyName 支持多种不同的操作
推荐阅读
- email - Google Cloud 上的 SMTP 电子邮件服务器托管 - 套接字错误 10060
- sharepoint - 如何上传 SharePoint 文档的自定义缩略图
- python - 如何在第二个显示器/显示器上打开 Tkinter GUI?(视窗)
- sql - 关于两个日期之间值总和的 SQL 查询
- reactjs - react-navigation 5和Formik处理提交不起作用
- c++ - 复制构造函数没有被调用
- c++ - 运行使用自定义 gcc 编译的应用程序时,动态链接器直接调用分段错误
- r - R中日期类对象中的字符数
- python - 使用 opencv 进行透视变形并使用 tkinter 显示它
- python - 尝试使用 <= 和 >= 日期明天 0100-2400 if 语句过滤 api 请求