はじめに
画面にデータを表示させたい!でもDynamoDBは1回のクエリで取得できるデータサイズが1MBと決まっているから
分割してデータを取得しないといけない!
という場面で活躍するLastEvaluatedKeyについて触れる機会があったので簡単にまとめてみたいと思います。
LastEvaluatedKeyとは
個人的なイメージですが本のしおりみたいなものです。「ここまで読んだ」というように、
LastEvaluatedKeyは「ここまでデータを取得した」を示す存在です。
そして「ここからデータを取得する」を示す存在としてExclusiveStartKeyというものがあります。
検索時にこのExclusiveStartKeyを使用することで続きからデータを取得してくれて、
かつデータを分割して取得しても順番がおかしいということがなくなります。
LastEvaluatedKeyの動き(例)
条件
・取得したいデータが全部で20件
・1回のクエリ検索で取得するデータが10件(検索の際「Limit」オプションで指定できます)
今回はクエリ検索を2回行います。
1回目のクエリ検索では以下のようなレスポンスを確認できます。
{'Items': [{'hoge': 'text1', 'huga': '12345'}, {'hoge': 'text2', 'huga': '12345'}],
'LastEvaluatedKey': {'id': '12345678', 'created_at': Decimal('0')}}
2回目のクエリ検索ではこのLastEvaluatedKeyをExclusiveStartKeyに指定してあげれば続きから検索してくれます。
'LastEvaluatedKey': {'id': '12345678', 'created_at': Decimal('0')}}
2回目のクエリ検索では20件に対して11件目~20件目を取得するため、続きのデータがありません。
その際はLastEvaluatedKeyが空で返ってきます。
'LastEvaluatedKey': {}
おわりに
RDSではこのような考えをしたことがなかったので新鮮でした。
重めのデータを扱う際はデータサイズの制限も考慮する必要があるので苦労しました。
また、ページネーションやGSIなどが絡んでくると頭の中がばたばたしました。この時のお話もどこかで記事にできればと思います。