Home Articles

Dynamodb:为什么主键不能成为filter-expression的一部分?

Asked
Viewed 970 times
2

假设我们有一个 item 的表,它有一个属性 userId (partition-key,string)和一个属性 creationTime (sort-key,number) . 我想在二级索引上执行一个查询,该查询从时间 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

这感觉很奇怪 . 在执行查询后,不仅仅过滤限制结果?是不是可以像这样实现像_1837460这样的条件?

1 Answer

  • 1

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

Related