使用主键和排序键上的两个条件查询表

Posted

技术标签:

【中文标题】使用主键和排序键上的两个条件查询表【英文标题】:Query a table with primary key and two conditions on sort key 【发布时间】:2019-10-25 18:25:45 【问题描述】:

我正在尝试使用分区键和排序键查询 dynamodb 表。排序键是一个 unix 日期,所以我想在排序的这两个日期之间请求 x 分区键。我目前可以通过表扫描来实现这一点,但我必须将其移至查询以提高速度。我在网上找不到任何像样的例子,说明人们使用分区键和排序键来查询他们的表。

我已仔细阅读此https://docs.aws.amazon.com/sdk-for-go/api/service/dynamodb/#DynamoDB.Query 并了解我的参数必须位于 KeyConditionExpression 内。

我已经阅读了https://github.com/aws/aws-sdk-go/blob/master/service/dynamodb/expression/examples_test.go 并总体上理解了它。但我就是找不到 KeyConditionExpression 的语法

我还以为是这样的:

keyCond := expression.Key("accountId").
    Equal(expression.Value(accountId)).
    And(expression.Key("sortKey").
    Between(expression.Value(fromDateDec), expression.Value(toDateDec)))

但这会引发:

ValidationException: Invalid KeyConditionExpression: 运算符或函数的操作数类型不正确;运算符或函数:BETWEEN,操作数类型:NULL

【问题讨论】:

莫非报错信息是准确的?即,fromDateDec 或 toDateDec 的值为 NULL? 是的。 toDate 应该是 in64 而不是十进制......我错误地阅读了错误消息,因为我使用了 between 函数 【参考方案1】:

首先你需要 KeyAnd 来结合 Hash Key 和 sort key 条件。

// keyCondition represents the key condition where the partition key
// "TeamName" is equal to value "Wildcats" and sort key "Number" is equal
// to value 1
keyCondition := expression.KeyAnd(expression.Key("TeamName").Equal(expression.Value("Wildcats")), expression.Key("Number").Equal(expression.Value(1)))

现在,您可以将相等条件替换为您的 between 条件,如下所示

// keyCondition represents the boolean key condition of whether the value
// of the key "foo" is between values 5 and 10
keyCondition := expression.KeyBetween(expression.Key("foo"), expression.Value(5), expression.Value(10))

【讨论】:

以上是关于使用主键和排序键上的两个条件查询表的主要内容,如果未能解决你的问题,请参考以下文章

在 Kafka ksqlDB 上连接两个表时出现错误“无效的连接条件:表-表连接需要在右输入表的主键上连接”

LIMIT 0,1 会加速主键上的 SELECT 吗?

SQL数据库的、外键和查询

mysql中,索引,主键,唯一索引,联合索引的区别是?对数据库的性能有啥影响?

5.mysql的基本查询

5.mysql的基本查询