无法转换属性的范围键值

Rik*_*löf 5 c# amazon nosql amazon-dynamodb

我正在使用带有C#驱动程序的dynamoDB,我有一个用户表.该表具有以下两个主键:

  • 主哈希键:UserId(数字)
  • 主范围键:创建(字符串)

然后我尝试在上下文中使用Load方法加载User,如下所示:

_dynamoDBClient.Context.Load<User>(12345);
Run Code Online (Sandbox Code Playgroud)

然后我得到以下例外:

"exceptionMessage":"无法转换属性Created的范围键值","exceptionType":"System.InvalidOperationException"

如果我加载特定的范围键,如:

_dynamoDBClient.Context.Load<User>(12345, "2015-01-01");
Run Code Online (Sandbox Code Playgroud)

一切都好.

是否有办法只使用主哈希键加载一个键入的用户,即使该表有一个范围键?我不希望每次需要获取用户时都发送创建日期.或者我是否想过了解dynamoDB中范围键的概念?

bsd*_*bsd 9

Load方法用于从表中检索单个项目,因此您需要提供整个主键.

在幕后,该Load方法实际上GetItem从本机AWS DynamoDB API 调用该操作,该API对于需要提供的属性具有以下要求:

对于主键,您必须提供所有属性.例如,使用哈希类型主键,您只需要提供哈希属性.对于散列和范围类型主键,您必须同时提供散列属性和范围属性.

资料来源:http: //docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html

如果表的主键由Hash和Range Key组成,则必须提供两者以匹配单个项.

现在,当涉及到您的数据模型时,Range Key用于对通常一起检索的相关记录进行分组.在您的情况下,我假设有其他用户具有相同UserId但具有不同的创建日期.如果您不需要将用户组合在一起(并按创建日期排序),那么仅使用哈希密钥就足够了.

这两个帖子可能会帮助您确定适用于不同场景的正确密钥类型:

在dynamodb表中使用Hash范围有什么用? 在dynamodb表中使用Hash范围有什么用?

什么时候用什么PK型? DynamoDB:何时使用什么PK类型?

  • 那清楚的事情.我意识到我正在以错误的方式使用范围键.我的用户模型不应该有创建日期作为范围键,因此UserId作为哈希键应该足够了.谢谢! (2认同)