ちょっとマニアックで癖のあるAWS DynmoDB。
FilterExpressionで絞り込み検索することは、多々あるかと思います。
データ一覧を、1ページ内に固定件数で表示する場合は、注意が必要です。
例えば、1ページ=50件とすると、pythonでは以下のようなコードになるかと思います。
tbl1 = dynamodb.Table("テーブル名") : : resp = tbl1.query( KeyConditionExpression=Key('キー名').eq('キー値'), FilterExpression=Attr('フィルタ項目名').eq('フィルタ値'), Limit=50 )
しかしこのままですと、対象データが存在していても、目標の50件が取り出せません。最悪0件という場合もあります。
dynamodbでは、Limitの件数を取り出した後に、FilterExpressionがかかります。
通常のRDBをご存じの方は、そんなバカな! という感じられるかと思います。ちょっとひどいですね。
Fillterして規定件数を、読み出したい場合は、以下のようにqueryをloopさせるしかありません。
reccnt=0 while( reccnt < 50 ): resp = tbl1.query( KeyConditionExpression=Key('キー名').eq('キー値'), FilterExpression=Attr('フィルタ項目名').eq('フィルタ値'), Limit=( 50 - reccnt ) ) if reccnt == 0 : items = resp['Items'] else: items.extend(resp['Items']) #検索集合を結合 reccnt = len(items)
それならこれでいいと思われるかもしれませんが、queryのcall回数のオーバヘッドが生じます。特に、残り1件で、フィルタ後の件数が0が続くと、何回もループしてしまい、応答遅れが顕著に現れます。
本対策としては、FilterExpressionは使わず、予めキーとしてテーブル設計を行う必要があるようです。
しかし既にデータが蓄積された状態では、途中からキー追加は避けたいところです。