2016-02-29 62 views
2

比方说,我们有一个表item,它有一个属性userId(分区键,字符串)和属性creationTime(排序键,数字)。我想执行一个查询,该查询从时间t1到时间t2的次级索引中提取用户的项目。Dynamodb:为什么主键不能成为过滤器表达式的一部分?

既然不能对同一项目多个范围的条件下,我的想法是,添加的过滤表达式限制结果:

aws dynamodb query --table-name items --index-name userId-creationTime-index --key-condition-expression "userId=:u AND creationTime<=:t1" --filter-expression "creationTime>=:t2" --expression-attribute-values '{":u":{"S":"6f3b581d-8632-4edc-a19d-b77f158d8a23"}, ":t1":{"N":"1456647476000000"}, ":t2":{"N":"1456561076000000"}}'

查询失败,

A client error (ValidationException) occurred when calling the Query operation: Filter Expression can only contain non-primary key attributes: Primary key attribute: creationTime

这感觉很奇怪。不过滤只是在执行查询后限制结果?难道不可能像这样实现像t1 <= creationDate <= t2这样的条件吗?

+2

找出使用BETWEEN运算符的解决方法。但是,如果任何人都可以解释为什么我不能在过滤表达式中使用相同的属性,那就太棒了! – user331244

+0

亚马逊代表表示这是“[为用户的利益。](https://forums.aws.amazon.com/thread.jspa?threadID=172530)”它仍然不是很清楚为什么用户限制使用关键条件表达式中的所有条件运算符(可在过滤器表达式中使用)。 – rob

+0

当你说二级索引是指本地二级索引?因为在这个例子中这似乎是可能的。 http://docs.amazonaws.cn/zh_CN/amazondynamodb/latest/developerguide/LSI.html#LSI.Querying – strongjz

回答

1

DynamoDB将首先从存储数据的主机中顺序读取您的物品页面。上面列出的关键条件用于限制从存储项目的主机读取的数据。接下来,它将根据您提供的过滤器参数过滤从存储主机读取的结果。存储主机上的实际读取卷会产生RCU。通过将KeyConditions用于主键属性和Filter表达式,可以更好地控制查询操作的读取成本。在查询操作的KeyCondition条件更严格时,将限制读取的项目数量,从而减少每个查询操作中消耗的RCU。

相关问题