ちょっとマニアックで癖のあるAWS DynmoDB。
時系列のログなどは、降順で読み出したいところです。pythonでは以下のようなコードになるかと思います。ScanIndexForwardを指定します。
tbl1 = dynamodb.Table("テーブル名")
:
:
resp = tbl1.query(
KeyConditionExpression=Key('キー名').eq('キー値'),
ScanIndexForward=False
)
しかし実際には、query一回の読出し量1MBの制約があります。1MBオーバのエラー検出をして、再読み込みさせるコードを書くなら、以下のように予め一定件数づつ読出しした方が効率的です。
resp = tbl1.query(
KeyConditionExpression=Key('キー名').eq('キー値'),
ScanIndexForward=False,
Limit=1000
)
当方では、以下のようにプライマリキーは、時刻を入れていました。
| 登録時刻(プライマリキー) | データ1 | データ2 | データ3 |
こうすると、一番新しい時刻から、1000件が降順で読み出されると考えてしまいます。
しかし実際には、読出し件数は、0となってしまいました!!
どうも「一番古いデータから、降順で1,000件」というリクエストと解釈されるようです。
当方では、以下のように対処しました。
resp = tb1.query(
KeyConditionExpression=Key('キー名').eq('キー値') & Key('時刻').lt('最新時刻'),
Limit=1000,
ScanIndexForward=False
)
‘最新時刻’は、弊方はデータに登録されている現在を用いましたが、現在時刻でもいけるのか未確認です。記録時刻の最大を求めたい場合は、 他RDBでSQL文ですとMAX関数で一発でもとまりますが、Dynamodbでは全件なめにいきそうな気配です。また1MB問題にひっかかりそうですね。