能否仅用DynamoDB Query实现指定客户的非取消订单查询?
订单表模型
{ order_id: Hash Key timestamp: Attribute customer_id: Attribute status: Attribute (new, pending, completed, cancelled) }
需求与现状
需要获取指定customer_id的所有未取消订单,并按timestamp排序。已创建以customer_id为Hash Key、timestamp为排序键的索引,但目前筛选status仍需使用Scan而非Query。
问题
- 是否仅用Query就能实现该需求?
- 若不行,Scan是否会利用该索引先按customer_id查询再过滤status,还是会遍历所有订单?
回答
仅用Query没法直接实现精准的查询阶段筛选,但可以用Query+FilterExpression的组合达到需求。DynamoDB的Query操作只能基于索引的Hash Key(这里是
customer_id)做精确匹配,再结合排序键(timestamp)做范围查询;而FilterExpression是在Query返回该customer_id下的所有订单后,在内存中过滤掉status为cancelled的条目——本质还是先拉取该用户的全部订单再过滤,但比全表Scan效率高很多。直接用Scan操作的话,默认会遍历整个表的所有数据,不会自动利用你创建的索引。即使显式指定用该索引做Scan,它也会遍历该索引里的所有条目(即所有
customer_id的记录),再过滤status,这种方式效率远不如Query加FilterExpression的组合。
更优的做法是执行Query时指定目标customer_id作为Hash Key,加上FilterExpression: status <> :cancelled(或status IN (:new, :pending, :completed)),同时设置ScanIndexForward来控制timestamp的排序方向,这样既能利用索引快速定位用户的所有订单,又能过滤掉已取消的条目。
内容的提问来源于stack exchange,提问作者RAKAHARDA

