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

Query DynamoDB secondary index by date range returns "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 键),并选择其他键作为分区键(因为分区键是必需的,而排序键是可选的)。

编辑: DynamoDB Query只支持查询单个分区,因此KeyConditionExpression中也需要分区键:

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

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