DynamoDBからqueryするときのKeyConditionExpressionのルール 【PKには = しか使えない】

AWSのDynamoDBの項目からqueryを使ってデータを取得するときに苦労した話

 

query のoption設定で必ず必要になるKeyConditionExpressionについて

queryのKeyConditionExpressionに必ず必要になるパーティションキー(PK)を参照した条件、演算子には”=” しか使うことはできない。

なので、queryで詳細な取得の条件を作るときは工夫が必要になってくる。

 

一番手っ取り早いのは、

  1. 値が全て必ず1になる項目をパーティションキーにする
  2. ソートキーを被りのない値が入る項目にする
  3. ソートキーで絞り込みの条件を作る

 

PK(数値) (パーティションキー) update-date (ソートキー) article-id body
1 1692592888 article-0000000000 textBox20000000000
1 1692592948 article-0000000001 textBox20000000001
1 1692593008 article-0000000002 textBox20000000002
1 1692593068 article-0000000003 textBox20000000003
…. ……

図:パーティションキーを使って絞り込みをできるようにしたDynamoDBのテーブルのイメージ

 

このテーブルでは、ソートキーには特定の時間をエポック秒に変換したものを登録させて、ある時間より前、後などの条件を用いて複数の項目を取得できるようにしている。

パーティションキーは登録時に必ず1が登録されるようにLambdaを組んだ。

 

パーティションキーを用いて絞り込みをするqueryのoptionの例

ExpressionAttributeValuesで宣言する値には変数を使うこともできる。

 

の部分のパーティションキーを参照した条件を

のような = 以外の演算子を用いたものにすると、CloudWatchでエラーが発生した。

 

AWSでqueryを絞り込みに使うのは本来は向いておらず、scanを使うのが望ましいらしい。ただ、scanを使うときは取り扱うデータ量が多く、処理に時間がかかりやすいことを考慮する必要があるため、スピードを重視する際は今回のような条件式を用いたqueryを使う必要がある。

 

参考文献

 

  1. PartitionKeyの絞り込みに = 以外は使えない これは確定

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA