在 C# 中使用 AWS DynamodB 文档模型查询 DynamoDB 表时,我观察到意外结果。
我的表
users
有一个用户名主键。 GSI 设置为 user_type
、user_id
和 username
键。
当我插入文档时,该表可以工作,但是当查询非索引但包含 GSI 的列时,它会返回此错误:
必须在请求中指定 KeyConditions 或 KeyConditionExpression 参数。
我已经在过滤器对象中指定了条件。为什么要求我提供
KeyConditions
或 KeyConditionExpression
?是否必须指定它们?如果是,我该怎么做?
文档中并不是 100% 清楚,但我相信如果您使用 DocumentModel 库只有当您的 GSI 具有范围键和分区键时,查询才会工作。相反,我会考虑使用标准 sdk QueryRequest
另一件事要检查的是您正在使用Amazon.DynamoDBv2.DocumentModel,因为在版本1中,您必须显式指定haskey
您可以通过 2 种方式执行 DynamoDB 搜索:
如果您选择
scan
,基本上您将扫描数据库的所有项目,并仅返回那些满足您作为“过滤器”传递的条件的项目。
如果您选择
query
,您将首先搜索索引,默认情况下仅创建一个索引,即表的主ID(默认情况下:id
)。当您使用查询时,您必须在“过滤器”表达式之前指定要执行的“keyCondition(s)”表达式。
您在这里看到的错误是,由于您使用的是
query
,因此您需要通过 keyConditions
。请注意,keyCondition(s) 是类似于过滤器的表达式,但仅包含您为其创建索引的字段。换句话说,如果 user_id
不是主 ID,则为该字段创建索引。