Item Collections
是所有有相同Partition Key
记录的集合,在DynamoDB中,query是指查一个 Item Collection
里的数据。只有同时具有Partition Key + Sort Key
的表才有Item collections
当我们调用Query API
时, 必须指定一个Key Condition
表达式,类似于SQL中的where语句,对Partition Key
和Sort Key
进行查询。查询的时候有两种形式:
Partition Key
,这时返回的是item collection
里所有的记录Partition Key
和特定的Sort Key
条件,如=, <, >, <=, >=, BETWEEN, BEGINS_WITH
另外可以指定Filter
表达式,它是在Query查询出来结果后再进行特定的过滤;在执行完Query
后,本次查询的RCU就确定了,但是Filter能让返回结果的数量大大减少,降低网络的负载与延迟
上一节我们查的ProductCatalog
表只有Partition Key
,我们本节查询Reply表,因为它既有Partition Key
,又有Sort Key
:
aws dynamodb scan --table-name Reply
现在只查询Id里Thread=1的数据:
aws dynamodb query \
--table-name Reply \
--key-condition-expression 'Id = :Id' \
--expression-attribute-values '{
":Id" : {"S": "Amazon DynamoDB#DynamoDB Thread 1"}
}' \
--return-consumed-capacity TOTAL
这张表的Sort Key是timestamp,所以我们可以加一个Key Condition表达式,只查询某个时间点后的评论:
aws dynamodb query \
--table-name Reply \
--key-condition-expression 'Id = :Id and ReplyDateTime > :ts' \
--expression-attribute-values '{
":Id" : {"S": "Amazon DynamoDB#DynamoDB Thread 1"},
":ts" : {"S": "2015-09-21"}
}' \
--return-consumed-capacity TOTAL
如果想对non-key
(即不是sort key也不是partition key)的属性进行过滤, 我们可以使用Filter
表达式,例如我们想查询User B发送的评论:
aws dynamodb query \
--table-name Reply \
--key-condition-expression 'Id = :Id' \
--filter-expression 'PostedBy = :user' \
--expression-attribute-values '{
":Id" : {"S": "Amazon DynamoDB#DynamoDB Thread 1"},
":user" : {"S": "User B"}
}' \
--return-consumed-capacity TOTAL
注意,返回结果里:
"Count": 1,
"ScannedCount": 2,
这说明Key Condition
表达式匹配到了两个记录,我们要为它付RCU费用。但是Filter
表达式会把结果数量降为1