3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

DynamoDbException: Conditions can be of length 1 or 2 only の対応方法

Last updated at Posted at 2023-05-14

DynamoDBのQuery オペレーションでデータ取得をした時に以下のエラーが発生されました。

DynamoDbException: Conditions can be of length 1 or 2 only

Dynamodb名 : stock_details

列名 Key
item_id PK String
type SK String
deliver_flag Boolean
content String
item_nm String
ins_ts Number
upd_ts Number

取得コード:

dynamo_db = Aws::DynamoDB::Client.new(
        access_key_id: 'aws_key',
        secret_access_key:'aws_secret',
        region: 'aws_region'
      )
options = {
  key_condition_expression: "item_id = :item_id AND type = :type AND deliver_flag = :deliver_flag",
  limit: 30,
  scan_index_forward: false,
  expression_attribute_values: {
  ':item_id' => '32381234562',
  ':type' => '101',
  ':deliver_flag' => false,
  },
  table_name: 'stock_details'
}
dynamo_db.query(options)

実行すると以下の例外が発生される
DynamoDbException: Conditions can be of length 1 or 2 onlyが発生される

DynamoDBの仕様で調べました。原因は「KeyConditionExpression」に「PK」 と 「SK」以外は利用できないことがわかりました。

検索条件を指定するには、キー条件式 (テーブルまたはインデックスから読み取る項目を決定する文字列) を使用します。
等価条件としてパーティションキーの名前と値を指定する必要があります。キー条件式では、非キー属性を使用することはできません。

【DynamoDB資料リンク】
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Query.html

Queryの結果から絞り込みが必要な場合は「filter_expression」を使って絞り込みできます。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Query.html#Query.FilterExpression

修正後:

dynamo_db = Aws::DynamoDB::Client.new(
        access_key_id: 'aws_key',
        secret_access_key:'aws_secret',
        region: 'aws_region'
      )

options = {
  key_condition_expression: "item_id = :item_id AND type = :type",
  filter_expression: "deliver_flag = :deliver_flag ",
  limit: 30,
  scan_index_forward: false,
  expression_attribute_values: {
  ':item_id' => '32381234562',
  ':type' => '1',
  ':deliver_flag' => false,
  },
  table_name: 'stock_details'
}
result = dynamo_db.query(options)
puts "Search Result : #{result}"

【実行結果:】

Search Result : {:items=>[{"item_id"=>"32381234562", "ins_ut"=>0.167534e10, "type"=>"1", "deliver_flag"=>false, "content"=>"test content", "item_nm"=>"desk"}], :count=>1, :scanned_count=>1, :last_evaluated_key=>nil, :consumed_capacity=>nil}
3
1
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
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?