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"} }'
無事目的のレコードが取得できました。