DynamoDB按分区键+排序键范围查询报错及代码求助
解决DynamoDB查询的KeyConditionExpression错误
这个错误的原因很明确:DynamoDB的KeyConditionExpression有严格规则——每个键(分区键或排序键)在表达式里只能对应一个条件。你现在对排序键#skey同时写了>= :v_from和<= :v_to两个独立条件,这就触发了这个报错。
修正方案
把排序键的两个范围条件合并成一个BETWEEN操作符的表达式,这样就符合每个键一个条件的要求了。以下是修正后的C#代码:
var partitionKey = 10; var from = DateTime.NowUtc.AddDays(-1); var to = DateTime.NowUtc; var queryRequest = new QueryRequest { TableName = _tableName, IndexName = "index", // 用BETWEEN合并排序键的范围条件,满足单键单条件规则 KeyConditionExpression = "#pkey = :v_pkey and #skey BETWEEN :v_from AND :v_to", ExpressionAttributeNames = { {"#pkey", "PartitionKey"}, {"#skey", "SortKey"} }, ExpressionAttributeValues = { {":v_pkey", new AttributeValue { N = partitionKey.ToString(CultureInfo.InvariantCulture) }}, {":v_from", new AttributeValue { N = new DateTimeOffset(from).ToUnixTimeSeconds().ToString(CultureInfo.InvariantCulture) }}, {":v_to", new AttributeValue { N = new DateTimeOffset(to).ToUnixTimeSeconds().ToString(CultureInfo.InvariantCulture) }} }, ScanIndexForward = true }; AmazonDynamoDBClient client = CreateClient(); var queryResponse = client.Query(queryRequest);
额外注意点
- 确认你指定的
"index"索引,确实是以PartitionKey作为分区键、SortKey作为排序键的索引(本地二级索引或全局二级索引),否则查询会因为索引结构不匹配而失败。 BETWEEN在DynamoDB里是包含边界值的,和你原来的>=+<=逻辑完全一致,不会改变查询结果的范围。
内容的提问来源于stack exchange,提问作者Kevin Smith
相关产品推荐
相关产品推荐

