按日期范围查询 DynamoDB 二级索引返回"Query key condition not supported"



当前

我正在尝试使用Lambda从DynamoDB检索按日期范围transDate(二级索引(过滤的数据子集。

功能:

const AWS = require("aws-sdk");
var dynamodbClient = new AWS.DynamoDB.DocumentClient();
let params = {
"TableName": "sales",
"IndexName": "transDate-index",
"KeyConditionExpression": "#tdate BETWEEN :v_start AND :v_end",
"ExpressionAttributeNames": {
"#tdate": "transDate"
},
"ExpressionAttributeValues": {
":v_start": "2021-07-29T00:00:00",
":v_end": "2021-08-01T24:00:00"
}
}
await new Promise((resolve, reject) => {
dynamodbClient.query(params, function (err, data) {
if (err) {
console.error(
"Unable to query. Error:",
JSON.stringify(err, null, 2)
);
reject(err);
} else {
console.log("Query succeeded.");
resolve(data);
}
});
});

二级指数:

Name: transDate-index
Partition key:  transDate (String)
Sort key: -
Read capacity:  On-demand
Projected attributes: Include: total, pluGroup, plu, transDate
Size: 0 Bytes
Item count: 0

问题

我收到以下错误:

"message": "Query key condition not supported",
"code": "ValidationException"

票据

我假设次要索引的大小和项目计数都显示为0,因为它们还没有填充(即新创建的索引(

问题

如何使我的查询工作?

顾名思义,分区键(又名HASH键(用于将数据划分为多个部分。不能按范围进行排序或查询。要做到这一点,您需要将其作为排序键(也称为RANGE键(,并选择其他东西作为分区键(因为分区键是必需的,而排序键是可选的(。

编辑:DynamoDBQuery只支持在单个分区上查询,因此KeyConditionExpression:中也需要分区密钥

"KeyConditionExpression": "partitionKeyName = :partitionkeyval AND #tdate BETWEEN :v_start AND :v_end"

如果您需要查询整个表,那么在辅助索引中,每个记录都需要具有相同的分区键值(即只有一个分区(。

最新更新