5
2

DynamoDB の KeyConditionExpression と FilterExpression で詰まった話

Posted at

DynamoDB に触ったこともない人間が
KeyConditionExpression と FilterExpression の違いで詰まったのでメモとして残しておきます

結論

  • KeyConditionExpression
    → パーティションキー or ソートキー の属性にのみ使用できる
  • FilterExpression
    → パーティションキー or ソートキー でない属性(非キー属性)にのみ使用できる
  • FilterExpression の方がだいぶいろいろできる

詳細

1. そもそも何に使うものか

KeyConditionExpression も FilterExpression も
DynamoDB のテーブル中から項目を検索する( Query を投げる)ときに使います

厳密には

  1. KeyConditionExpression を使用して、DynamoDBテーブルにクエリを投げる
  2. 1 の結果に対して FilterExpression を適用し、結果を返す

という流れのようです

詳細はこちら

2. 2つの違いはなにか

自分が理解している範囲で大きく3つあります

  1. 使用できる属性の違い
  2. 使用できる演算子の違い
  3. 読み込みキャパシティー消費の有無

違い1:使用できる属性の違い

結論で述べたとおり

  • KeyConditionExpression
    → パーティションキー or ソートキー の属性にのみ使用できる
  • FilterExpression
    → パーティションキー or ソートキー でない属性(非キー属性)にのみ使用できる

違い2:使用できる演算子の違い

FilterExpression の方が大分幅広いです

KeyConditionExpression

ざっくり

  • 等しいかどうか
  • 大小関係
  • 指定した範囲に収まるかどうか
  • 特定の文字列から始まるかどうか

かつ、仕様できる演算子は属性につき1つです

FilterExpression

KeyConditionExpression の演算子に加えて

  • 指定したリスト内の値に含まれるか
  • 指定した値でないかどうか

などいろいろできます

違い3:読み込みキャパシティー消費の有無

DynamoDB の料金体系にかかわるのは

  • キャパシティーユニット
  • データストレージ(保存容量)
  • データ転送
  • その他オプション

読み込みキャパシティは
DynamoDB に保存されているデータの大きさ(返す結果の大きさではなく)
をもとに消費されるらしく、

つまり DynamoDB からデータを引っ張ってこようとすると
KeyConditionExpression の有無にかかわらずキャパシティーを消費するようです

対して、FilterExpression の方は Query 完了後に適用されるので、
FilterExpression があってもなくても読み込みキャパシティーが消費されるということはないようです

ちなみに

では、KeyConditionExpression を設定せずに FilterExpression だけで何とかすればいいのでは?とも思ったのですが、
Query はパーティションキーの指定が必須らしいので FilterExpression だけというのは不可能のようです

気になっている点

  1. できるだけ KeyConditionExpression を使用し、FilterExpression は最小限
  2. できるだけ KeyConditionExpression は使用せず、FilterExpression を多用

(それが可能なテーブル構造であるという前提)

この場合、
読み込みキャパシティ的には変わらない(つまり料金的には変わらない)様なのですが、
速度とかどうなんでしょうか?(次回の課題にします)

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2