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}