使用query查询数据

Item Collections是所有有相同Partition Key记录的集合,在DynamoDB中,query是指查一个 Item Collection里的数据。只有同时具有Partition Key + Sort Key的表才有Item collections

当我们调用Query API时, 必须指定一个Key Condition表达式,类似于SQL中的where语句,对Partition KeySort 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

image-20230107224934681

现在只查询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

image-20230107225155141

如果想对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

image-20230107225400300

注意,返回结果里:

"Count": 1,
"ScannedCount": 2,

这说明Key Condition表达式匹配到了两个记录,我们要为它付RCU费用。但是Filter表达式会把结果数量降为1