You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:21:51