Dynamodb:为什么主键不能成为过滤器表达式的一部分?
Dynamodb: Why can't a primary key be part of a filter-expression?
假设我们有一个带有 item
的 table,它有一个属性 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
这样的条件不可以实现吗?
DynamoDB 将首先从存储您的数据的主机中按顺序读取您的项目页面。上面列出的关键条件用于限制从存储您的项目的主机读取数据。接下来,它会根据您提供的过滤参数过滤从存储主机读取的结果。 RCU是存储主机实际读取量产生的。通过对主键属性使用 KeyConditions,对其他所有属性使用 Filter 表达式,您可以更好地控制查询操作的读取成本。对查询操作的 KeyCondition 设置更严格的条件将限制读取的项目数,从而减少每个查询操作中消耗的 RCU。
假设我们有一个带有 item
的 table,它有一个属性 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
这样的条件不可以实现吗?
DynamoDB 将首先从存储您的数据的主机中按顺序读取您的项目页面。上面列出的关键条件用于限制从存储您的项目的主机读取数据。接下来,它会根据您提供的过滤参数过滤从存储主机读取的结果。 RCU是存储主机实际读取量产生的。通过对主键属性使用 KeyConditions,对其他所有属性使用 Filter 表达式,您可以更好地控制查询操作的读取成本。对查询操作的 KeyCondition 设置更严格的条件将限制读取的项目数,从而减少每个查询操作中消耗的 RCU。