我正在使用带有 C# 驱动程序的 dynamoDB,并且我有一个包含用户的表。该表有以下两个主键:
然后我尝试在上下文中使用 Load 方法加载用户,如下所示:
_dynamoDBClient.Context.Load<User>(12345);
然后我会遇到以下异常:
“exceptionMessage”:“无法转换属性的范围键值 创建”,“异常类型”:“System.InvalidOperationException”
如果我加载特定范围键,例如:
_dynamoDBClient.Context.Load<User>(12345, "2015-01-01");
一切都好。
即使表有范围键,是否有办法仅使用主哈希键加载键入的用户?我不想每次需要获取用户时都发送创建日期。或者我是否误解了 dynamoDB 中范围键的概念?
Load
方法用于从表中检索单个项目,因此您需要提供整个主键。
在幕后,
Load
方法实际上从本机 AWS DynamoDB API 调用 GetItem
操作,该 API 对于需要提供的属性有以下要求:
对于主键,您必须提供所有属性。为了 例如,对于哈希类型主键,您只需要提供 哈希属性。对于哈希和范围类型的主键,您必须 提供 hash 属性和 range 属性。
来源: http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html
如果您的表的主键由哈希键和范围键组成,那么您必须提供两者来匹配单个项目。
现在,当涉及到数据模型时,范围键用于对通常一起检索的相关记录进行分组。在您的情况下,我假设其他用户具有相同的
UserId
但创建日期不同。如果您不需要将用户分组在一起(并按创建日期排序),那么仅具有哈希键可能就足够了。
另外两篇文章可能会帮助您确定用于不同场景的正确密钥类型:
Dynamodb 表中的哈希范围有何用途? Dynamodb 表中的哈希范围有什么用?
什么时候使用什么PK类型? DynamoDB:何时使用什么 PK 类型?
当你想通过 PK 直接调用一个项目时,那么你的表必须使用足够的 PK (哈希键)创建,因此在创建表时不要添加排序键..
var sequence = await dynamoDBContext.LoadAsync<SequenceLogModel>("global_counter");