如何在C#中获取DynamoDB表的所有分区键列表
在C#中高效获取DynamoDB表的所有分区键列表
核心思路
因为你的表没有排序键且分区键唯一,不需要全量拉取数据,只需通过Scan操作并指定投影表达式仅返回分区键,就能高效获取所有唯一的分区键列表,避免不必要的数据传输。
前置依赖
先安装AWS SDK for .NET的DynamoDB包:
# NuGet包管理器命令 Install-Package AWSSDK.DynamoDBv2 # 或.NET CLI命令 dotnet add package AWSSDK.DynamoDBv2
实现方案
方案1:使用低级别AmazonDynamoDBClient(灵活可控)
适合需要精细控制扫描参数的场景,自动处理分页:
using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.Model; using System.Collections.Generic; using System.Threading.Tasks; public async Task<List<string>> GetAllPartitionKeysAsync(string tableName, string partitionKeyName) { var partitionKeys = new List<string>(); // 若需指定区域或本地DynamoDB,可传入AmazonDynamoDBConfig配置 var client = new AmazonDynamoDBClient(); string lastEvaluatedKey = null; do { var scanRequest = new ScanRequest { TableName = tableName, // 仅投影分区键,减少数据传输量 ProjectionExpression = partitionKeyName, // 处理分页,传入上一页的最后一个分区键 ExclusiveStartKey = lastEvaluatedKey != null ? new Dictionary<string, AttributeValue> { { partitionKeyName, new AttributeValue { S = lastEvaluatedKey } } } : null }; var scanResponse = await client.ScanAsync(scanRequest); // 提取分区键值(此处假设分区键为字符串类型) foreach (var item in scanResponse.Items) { partitionKeys.Add(item[partitionKeyName].S); // 若分区键为数字类型,改用: // partitionKeys.Add(item[partitionKeyName].N); // 或转成对应数值类型:int.Parse(item[partitionKeyName].N) } // 更新分页标记 lastEvaluatedKey = scanResponse.LastEvaluatedKey?.ContainsKey(partitionKeyName) == true ? scanResponse.LastEvaluatedKey[partitionKeyName].S : null; } while (lastEvaluatedKey != null); return partitionKeys; }
方案2:使用高级别DocumentModel(简洁易用)
AWS提供的高级封装,代码更简洁,自动处理分页:
using Amazon.DynamoDBv2.DocumentModel; using Amazon.DynamoDBv2; using System.Collections.Generic; using System.Threading.Tasks; public async Task<List<string>> GetAllPartitionKeysWithDocumentModelAsync(string tableName, string partitionKeyName) { var partitionKeys = new List<string>(); var client = new AmazonDynamoDBClient(); var table = Table.LoadTable(client, tableName); var scanConfig = new ScanOperationConfig { // 仅投影分区键 ProjectionExpression = partitionKeyName }; // 遍历所有分页结果 var scanBatch = table.Scan(scanConfig); do { var documents = await scanBatch.GetNextSetAsync(); foreach (var doc in documents) { // 字符串类型分区键 partitionKeys.Add(doc[partitionKeyName].AsString()); // 数字类型改用: // partitionKeys.Add(doc[partitionKeyName].AsInt().ToString()); } } while (!scanBatch.IsDone); return partitionKeys; }
注意事项
- 确保执行代码的IAM角色/用户拥有DynamoDB的
Scan权限 - 投影表达式必须准确匹配表的分区键名称,大小写敏感
- 若表数据量极大(百万级以上),可启用并行扫描:通过设置
ScanRequest.TotalSegments和ScanRequest.Segment参数拆分扫描任务,提升速度 - 因你的表分区键唯一,无需额外去重操作
内容的提问来源于stack exchange,提问作者James Buschow
相关产品推荐
相关产品推荐

