ちょっとマニアックで癖のある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問題にひっかかりそうですね。