Amazon web services Dynamodb:为什么可以';主键不是筛选器表达式的一部分吗?

Amazon web services Dynamodb:为什么可以';主键不是筛选器表达式的一部分吗?,amazon-web-services,amazon-dynamodb,aws-cli,Amazon Web Services,Amazon Dynamodb,Aws Cli,假设我们有一个带有items的表,它有一个属性userId(分区键,字符串)和一个属性creationTime(排序键,编号)。我想执行一个查询,在二级索引上从时间t1到时间t2获取用户的项目 因为我不能在同一个项目上有多个范围条件,所以我的想法是添加一个过滤表达式来限制结果: aws dynamodb查询--表名项--索引名userId creationTime索引--关键条件表达式“userId=:u和creationTime=:t2”--表达式属性值“{”:u:{”S:“6f3b581d-

假设我们有一个带有
item
s的表,它有一个属性
userId
(分区键,字符串)和一个属性
creationTime
(排序键,编号)。我想执行一个查询,在二级索引上从时间
t1
到时间
t2
获取用户的项目

因为我不能在同一个项目上有多个范围条件,所以我的想法是添加一个过滤表达式来限制结果:

aws dynamodb查询--表名项--索引名userId creationTime索引--关键条件表达式“userId=:u和creationTime=:t2”--表达式属性值“{”:u:{”S:“6f3b581d-8632-4edc-a19d-b77f158d8a23”},:t1:{“N:“14566476000000”},:t2:{“N:“145656107600000”}

查询失败,原因是

调用查询操作时发生客户端错误(ValidationException):筛选器表达式只能包含非主键属性:主键属性:creationTime


这感觉很奇怪。过滤不只是限制查询执行后的结果吗?难道不可能实现像
t1这样的条件吗?DynamoDB将首先从存储数据的主机上按顺序读取一页项目。上面列出的关键条件用于限制从存储项目的主机读取的数据。接下来,它将根据您提供的筛选参数筛选从存储主机读取的结果。存储主机上的实际读取卷会产生RCU。通过对主键属性使用KeyConditions,对其他所有内容使用Filter表达式,可以更好地控制查询操作的读取成本。对查询操作的KeyCondition设置更严格的条件将限制读取的项目数,从而减少每个查询操作中消耗的RCU。

使用BETWEEN运算符找到了一种解决方法。但是,如果有人能解释为什么我不能在过滤表达式中使用相同的属性,那就太好了!Amazon rep表示,“用户为什么不能在关键条件表达式中使用所有条件运算符(在筛选器表达式中可用)还不太清楚。当你说二级索引时,你是指本地二级索引吗?”?因为在这个例子中这似乎是可能的。这是为GSI准备的