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

传入PK、SK时,如何从索引名称确定DynamoDB范围键?

问题:DynamoDB查询索引时提示“Unable to determine range key from index name”

报错信息

Unable to determine range key from index name.

相关代码

CustomerManager.cs

public async Task<List<CustomerResponse>> GetCustomers()
{
    var myCustomers = await m_CustomerEngine.GetSitesWithClientDetails();
    if (myCustomers == null) return null;

    var siteMonitors = new List<Monitor>();
    var names = new List<string>
    {
        "SITE"
    };
    var running = await m_MonitorEngine.QueryIndexItems("SITE:RUNNING", QueryOperator.BeginsWith, names, "GSI-Reverse").ConfigureAwait(false);
    var notRunning = await m_MonitorEngine.QueryIndexItems("SITE:NOTRUNNING", QueryOperator.BeginsWith, names, "GSI-Reverse").ConfigureAwait(false);

    if (running != null && running.Count > 0) siteMonitors.AddRange(running);

    if (notRunning != null && notRunning.Count > 0) siteMonitors.AddRange(notRunning);

    // return MapDynamoCustomerStatus(dCustomers, siteMonitors);
    return MapMySqlCustomerStatus(myCustomers, siteMonitors);
}

数据模型(Monitor类)

[DynamoDBTable("xyz")]
public class Monitor
{
    [DynamoDBHashKey("PK")]
    public string Site { get; set; }

    [DynamoDBRangeKey("SK")]
    public string Service { get; set; }

    [DynamoDBProperty("_rawData")]
    public string RawData { get; set; }
}

MonitorRepository.cs

public AsyncSearch<Monitor> QueryIndexItems(string hashKey, QueryOperator queryOperator, IEnumerable<object> values, string indexName)
{
    try
    {
        var tableName = m_Configuration["DynamoDbTables:Monitor"] ?? "ClientMonitoring-qa";
        DynamoDBOperationConfig config = new DynamoDBOperationConfig
        {
            OverrideTableName = tableName,
            IndexName = indexName
        };
        var data = m_MonitorContext.QueryItems(hashKey, queryOperator, values, config);
        return data;
    }
    catch (Exception ex)
    {
        throw new Exception($"Amazon error in MonitorRepository.QueryItems table operation! Error: {ex}");
    }
}

DynamoDBRepository.cs

public AsyncSearch<T> QueryItems(string hashKey, QueryOperator queryOperator, IEnumerable<object> values, DynamoDBOperationConfig config)
{
    var data = base.QueryAsync<T>(hashKey, queryOperator, values, config);
    return data;
}

解决方案

报错核心原因是AWS SDK无法从Monitor模型中识别GSI-Reverse全局二级索引的范围键定义,导致无法解析查询请求。以下是两种可行解决方式:

方式一:在数据模型中标注GSI键属性

先通过AWS控制台确认GSI-Reverse的实际结构(哈希键、范围键对应表中哪个字段),然后在Monitor类的对应属性上添加GSI专属标注。

假设GSI-Reverse的哈希键是SK、范围键是PK,修改后的模型如下:

[DynamoDBTable("xyz")]
public class Monitor
{
    [DynamoDBHashKey("PK")]
    [DynamoDBGlobalSecondaryIndexRangeKey("GSI-Reverse")]
    public string Site { get; set; }

    [DynamoDBRangeKey("SK")]
    [DynamoDBGlobalSecondaryIndexHashKey("GSI-Reverse")]
    public string Service { get; set; }

    [DynamoDBProperty("_rawData")]
    public string RawData { get; set; }
}

这种方式让SDK直接通过模型识别索引结构,代码更易维护。

方式二:在查询配置中显式指定索引键名

如果不想修改模型,可在DynamoDBOperationConfig中直接指定索引的哈希键和范围键名称,绕过模型属性依赖:

public AsyncSearch<Monitor> QueryIndexItems(string hashKey, QueryOperator queryOperator, IEnumerable<object> values, string indexName)
{
    try
    {
        var tableName = m_Configuration["DynamoDbTables:Monitor"] ?? "ClientMonitoring-qa";
        DynamoDBOperationConfig config = new DynamoDBOperationConfig
        {
            OverrideTableName = tableName,
            IndexName = indexName,
            // 替换为GSI-Reverse实际的哈希键、范围键名称
            IndexHashKey = new AttributeValue { S = "SK" },
            IndexRangeKey = new AttributeValue { S = "PK" }
        };
        var data = m_MonitorContext.QueryItems(hashKey, queryOperator, values, config);
        return data;
    }
    catch (Exception ex)
    {
        throw new Exception($"Amazon error in MonitorRepository.QueryItems table operation! Error: {ex}");
    }
}

额外注意事项

  • 确保查询参数与GSI结构匹配:当前传入的hashKey要对应GSI的哈希键字段,QueryOperator.BeginsWith的values参数要对应GSI的范围键字段。
  • 提前确认GSI实际结构:通过AWS控制台查看xyz表的GSI-Reverse配置,明确键字段名称,避免配置错误。

内容的提问来源于stack exchange,提问作者KamalaH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 18:57:55