web-dev-qa-db-ja.com

AWS DynamoDbでRangeキーの最大値をクエリする

DynamoDBに相当するものは何ですか

SELECT MAX(RANGE_KEY) FROM MYTABLE WHERE PRIMARYKEY = "value"

私が思いつくことができる最高のものは

from boto.dynamodb2.table import Table as awsTable

tb = awsTable("MYTABLE")
rs = list(tb.query_2(PRIMARYKEY__eq="value", reverse=True, limit=1))
MAXVALUE = rs[0][RANGE_KEY]

これを行うより良い方法はありますか?

21
Vishal

それが正しい方法です。

ハッシュキーで一致したレコードは範囲キーで並べ替えられるため、最初のレコードを子孫順に取得すると、最大範囲キーを持つレコードが得られます。

クエリ結果は常に範囲キーでソートされます。範囲キーのデータ型が数値の場合、結果は数値順に返されます。それ以外の場合、結果はASCII文字コード値の順序で返されます。デフォルトでは、ソート順は昇順です。順序を逆にするには、ScanIndexForwardパラメータをfalseに設定します。

クエリとスキャン操作-Amazon DynamoDB: http://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html

注:boto APIを介してreverseパラメータをtrueに設定することは、ネイティブAWS APIを介してScanIndexForwardをfalseに設定することと同等です。

13
bsd

Javaでそれを行う方法を探している人がいる場合:

QuerySpec querySpec = new QuerySpec();
        querySpec.withKeyConditionExpression("PRIMARYKEY = :key")
                .withValueMap(new ValueMap()
                        .withString(":key", primaryKeyValue));
        querySpec.withScanIndexForward(true); 
        querySpec.withMaxResultSize(1);
8
user3485142

Boto3では、次のように実行できます。

import boto3
from boto3.dynamodb.conditions import Key, Attr

kce = Key('table_id').eq(tableId) & Key('range').between(start, end)
output = table.query(KeyConditionExpression = kce, ScanIndexForward = False, Limit = 1) 

出力には、開始と終了の間の範囲の最大値に関連付けられた行が含まれます。最小値については、ScanIndexForwardTrueに変更します

3
abedfar