AWS CLIからdynamoDBへtableを新規作成する create-table とレコードを追加する putitems は以前書きましたが、query についてのメモです。
プライマリーソートキーに予約語を使用してしまっている場合、例えば “timestamp” をキーに使用していると
–key-condition-expression にキー名を直接指定するとエラーになりレコードが取得できません。
その場合、–expression-attribute-names で別名を指定して回避できます。例えば下記では”timestamp”キー名を一旦#tstampにエスケープしています。
予約語 timestamp を含む例:
テーブル: mytest_table
プライマリパーティションキー: hostname (文字列)
プライマリソートキー: timestamp (文字列)
hostnameが”myhostname1″でtimestampが2018/11/01から11/20までのデータ(11/01 0:00 ~ 11/20 0:00)をクエリする。
aws dynamodb query \
--table-name mytest_table \
--key-condition-expression "#hname = :a1 and #tstamp between :t1 and :t2" \
--expression-attribute-names '{"#hname": "hostname", "#tstamp": "timestamp"}' \
--expression-attribute-values '{":a1":{"S":"myhostname1"}, ":t1":{"S":"2018-11-01"}, ":t2":{"S":"2018-11-20"}}'
一般的な使用方法
テーブル: Music
プライマリパーティションキー: Artist (文字列)
プライマリソートキー: SongTitle (文字列)
から Artist が”The Beatles” でSongTitleが”A”から”M”で始まるレコードをクエリするには
aws dynamodb query \
--table-name Music \
--key-condition-expression 'Artist = :a AND SongTitle BETWEEN :t1 AND :t2' \
--expression-attribute-values '{
":a": {"S": "The Beatles"},
":t1": {"S": "A"},
":t2": {"S": "M"}
}'
結果 1曲しか登録していませんが…
{
"Count": 1,
"Items": [
{
"SongTitle": {
"S": "From Me To You"
},
"Artist": {
"S": "The Beatles"
}
}
],
"ScannedCount": 1,
"ConsumedCapacity": null
}

また、
–key-condition-expression には “=, <, >, >=”なども使用できるので、The Beatles の A以降で始まるレコード一覧は
aws dynamodb query \
--table-name Music \
--key-condition-expression 'Artist = :a AND SongTitle >= :t1' \
--expression-attribute-values '{
":a": {"S": "The Beatles"},
":t1": {"S": "A"}
}'
無事目的のレコードが取得できました。

