AWS dynamoDB のキーに予約語timestampを使用している場合のCLIからのquery

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"} 
  }'

無事目的のレコードが取得できました。

コメントを残す

メールアドレスが公開されることはありません。

10 + 11 =