尝试了解 DynamoDB .NET 中的查询表操作

Alp*_*per 5 .net c# amazon-web-services nosql amazon-dynamodb

我正在使用 DynamoDB .NET 并试图理解它,但我对执行以下句子有疑问:“获取具有特定值的所有行”。例如,我有下表:

身份证 | 公司 | 代码

其中 Id 和 Company 是主键(组合),我的查询是“获取属于一家公司及其 id 的所有代码”

我读到扫描操作比查询更昂贵,如果我的表有一个由哈希和范围属性组成的主键,我应该使用查询语句。

好的,所以我开始编写我的句子,我有这个:

Table table = Table.LoadTable(dynamoClient, tablename );

QueryFilter filter = new QueryFilter();
filter.AddCondition("Company", QueryOperator.Equal, company); //company is a parameter

QueryOperationConfig config = new QueryOperationConfig()
{
    Filter = filter,
    Select = SelectValues.SpecificAttributes,
    AttributesToGet = new List<string> { "Id","Code" },
    ConsistentRead = true
};

Search tableResult = myTable.Query(config);
Run Code Online (Sandbox Code Playgroud)

当我执行该操作时,出现以下错误:

选择获取 ALL_ATTRIBUTES 时无法指定 AttributesToGet

我阅读了文档,但我不明白,我正在观看这个问题How to query range keyprogrammatically in DynamoDB,但对我没有帮助。

很明显我做得不好,而且我的知识有限。那么,有人可以解释我如何实现查询或者我是否必须使用扫描操作吗?

非常感谢。如果需要更多信息,请告诉我。

Alp*_*per 5

好吧,在搜索和测试了许多可能的解决方案来解决我的问题之后,我可以理解我对桌子所做的事情是错误的。事情是这样的:

我的桌子由以下人员组成:

  • 哈希键 = id
  • 范围 = 公司
  • 属性非关键 = 代码

我想获取具有特定公司的所有代码。所以,我试图使用 RANGE 条件而不是使用 HASH KEY 来查询表,这是错误的!

将表模型更改为

  • 哈希键 = 公司
  • 范围 = id
  • 属性非关键 = 代码

完美运作

这解释了一切(来自官方 Amazon Dynamodb 文档)

查询操作仅使用主键属性值查找表或二级索引中的项目。您必须提供哈希键属性名称和要搜索的不同值。您可以选择提供范围键属性名称和值,并使用比较运算符来优化搜索结果。默认情况下,查询操作返回具有指定主键的项目的所有数据属性;但是,您可以使用 ProjectionExpression 参数,以便 Query 操作仅返回部分属性,而不是全部属性。

如果您想了解更多信息,请点击以下链接

[更新]读得更深入后,我可以理解GSI(全球二级指数)的概念。尊重表的初始模型并将 GSI 添加到 [Company,Code],我可以毫无问题地执行查询。