我们假设我们有一个item
的表,其中包含属性userId
(分区键,字符串)和属性creationTime
(排序键,数字) )。我想执行一个查询,用于在次要索引上从时间t1
到时间t2
获取用户的项目。
由于我在同一个项目上不能有多个范围条件,我的想法是添加一个过滤表达式来限制结果:
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
这样的条件?
答案 0 :(得分:1)
DynamoDB将首先从存储数据的主机中顺序读取您的项目页面。上面列出的关键条件用于限制从存储项目的主机读取的数据。接下来,它将根据您提供的过滤器参数过滤从存储主机读取的结果。 RCU会因存储主机上的实际读取量而产生。通过将KeyConditions用于主键属性,将Filter表达式用于其他所有属性,可以更好地控制查询操作的读取成本。在查询操作的KeyCondition上具有更严格的条件将限制读取的项目数,从而减少每个查询操作中消耗的RCU。