DynamoDBのクエリまたはスキャンAPIを使用して結果を注文することは可能ですか?
DynamoDBにSQLクエリからの[ORDERBY 'フィールド']のようなものがあるかどうかを知る必要がありますか?
ありがとう。
回答:
ただし、明示的ではありませんが、実際の多くのユースケースでは明らかに順序付けが必要であり、それに応じてハッシュおよび範囲タイプの主キーを使用してモデル化できます。
この場合、主キーは2つの属性で構成されます。最初の属性はハッシュ属性で、2番目の属性は範囲属性です。Amazon DynamoDBは、ハッシュ主キー属性に順序付けされていないハッシュインデックスを作成し、範囲主キー属性に並べ替えられた範囲インデックスを作成します。[私の強調]
その後、経由して、必要に応じて、要求項目に、この範囲のインデックスを使用することができますRangeKeyConditionのパラメータクエリAPIと指定し、前方または後方のインデックスのトラバースを経由して(つまり、ソート方向を)ScanIndexForwardのパラメータ。
更新:同じ方法で、ローカルセカンダリインデックスを持つ属性で並べ替えることができます。
並べ替えキーを使用し、クエリでScanIndexForwardパラメータを適用して、昇順または降順で並べ替えることができます。ここでは、返されるアイテムを1に制限します。
var params = {
TableName: 'Events',
KeyConditionExpression: 'Organizer = :organizer',
Limit: 1,
ScanIndexForward: false, // true = ascending, false = descending
ExpressionAttributeValues: {
':organizer': organizer
}
};
docClient.query(params, function(err, data) {
if (err) {
console.log(JSON.stringify(err, null, 2));
} else {
console.log(JSON.stringify(data, null, 2));
}
});
ScanIndexForward(昇順の場合はtrue、降順の場合はfalse)を使用し、クエリ式のsetLimit値を使用して結果を制限することもできます。
単一のレコードを見つけるためにQueryPageを使用したコードの下を見つけてください。
public void fetchLatestEvents() {
EventLogEntitySave entity = new EventLogEntitySave();
entity.setId("1C6RR7JM0JS100037_contentManagementActionComplete");
DynamoDBQueryExpression<EventLogEntitySave> queryExpression = new DynamoDBQueryExpression<EventLogEntitySave>().withHashKeyValues(entity);
queryExpression.setScanIndexForward(false);
queryExpression.withLimit(1);
queryExpression.setLimit(1);
List<EventLogEntitySave> result = dynamoDBMapper.queryPage(EventLogEntitySave.class, queryExpression).getResults();
System.out.println("size of records = "+result.size() );
}
@DynamoDBTable(tableName = "PROD_EA_Test")
public class EventLogEntitySave {
@DynamoDBHashKey
private String id;
private String reconciliationProcessId;
private String vin;
private String source;
}
public class DynamoDBConfig {
@Bean
public AmazonDynamoDB amazonDynamoDB() {
String accesskey = "";
String secretkey = "";
//
// creating dynamo client
BasicAWSCredentials credentials = new BasicAWSCredentials(accesskey, secretkey);
AmazonDynamoDB dynamo = new AmazonDynamoDBClient(credentials);
dynamo.setRegion(Region.getRegion(Regions.US_WEST_2));
return dynamo;
}
@Bean
public DynamoDBMapper dynamoDBMapper() {
return new DynamoDBMapper(amazonDynamoDB());
}
}
問題を解決する必要がある別のオプションは
これにより、必要に応じてテーブルの任意の値を並べ替えることができます。これは、クエリ全体を取得して後でフィルタリングすることなく、テーブル内で最高ランクのアイテムを見つけるための非常に効率的な方法です。
boto2を使用していて、テーブルの列の1つに並べ替えキーがある場合は、次のように言って、取得したものを順序または逆の順序で並べ替えることができます。
result = users.query_2(
account_type__eq='standard_user',
reverse=True)
boto3を使用していて、結果を並べ替える列に並べ替えキーがある場合は、次のように言って、取得したデータを並べ替えることができます。
result = users.query(
KeyConditionExpression=Key('account_type').eq('standard_user'),
ScanIndexForward=True)
ScanIndexForwardがtrueの場合、boto3で、DynamoDBは結果を保存されている順序で(ソートキー値によって)返します。これがデフォルトの動作です。ScanIndexForwardがfalseの場合、DynamoDBはソートキー値の逆順で結果を読み取り、結果をクライアントに返します。
テーブルがすでに存在する場合は、テーブルに必要な属性にGSI(グローバルセカンダリインデックス)を追加し、スキャンではなくクエリを使用します。テーブルを作成しようとしている場合は、必要な属性にLSI(ローカルセカンダリインデックス)を追加できます。