5
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.

はじめに

画面にデータを表示させたい!でも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などが絡んでくると頭の中がばたばたしました。この時のお話もどこかで記事にできればと思います。

5
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
5
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?