データ取得時の注意
DynamoDBからデータ取得(scan,query)を行う場合、一回のリクエストで最大1MBしか取得できない様です。
さらに、1MB以上のデータをリクエストした場合切り捨てられエラーにもならない!
(全件取得できてるか判別するステータスはありますが)
解決策
レスポンスをページングして取得。
例えば、
sample.rb
def client
Aws::DynamoDB::Client.new
end
def get_date
id = XXX
from = DateTime
to = DateTime
resp = client.query(
table_name: XXX, #テーブル名
scan_index_forward: true or false, #order
key_condition_expression: #ハッシュキー
'id = :id AND created_at BETWEEN :from AND :to'
expression_attribute_values: {
# ハッシュキーにてプレースホルダとして利用
:id = id,
:from = from,
:to = to
}
)
end
とあった時に
def client
Aws::DynamoDB::Client.new
end
def get_date
+ resp_array = []
id = XXX
from = DateTime
to = DateTime
resp = client.query(
table_name: XXX, #テーブル名
scan_index_forward: true or false, #order
key_condition_expression: #ハッシュキー
'id = :id AND created_at BETWEEN :from AND :to'
expression_attribute_values: {
# ハッシュキーにてプレースホルダとして利用
:id = id,
:from = from,
:to = to
}
)
+ resp.each_page do |page|
+ resp_array.concat(page.items)
+ end
end
とすることで1MB以上のレスポンスでも取得できる。
解説
1行目 resp_array = []
で配列を作成。
17行目以下3行でデータをページングして取得。
→取得しきるまで繰り返しresp_arrayへ格納。