100

DynamoDB でクエリまたはスキャン API を使用して結果を注文することはできますか?

DynamoDB にORDER BY 'field'SQL クエリのようなものがあるかどうかを知る必要がありますか?

ありがとう。

4

7 に答える 7

47

ただし、明示的ではありませんが、実際の多くのユースケースでは順序付けが明らかに必要であり、それに応じてハッシュおよび範囲タイプの主キーを使用してモデル化できます。

この場合、主キーは2つの属性で構成されます。最初の属性はハッシュ属性で、2番目の属性は範囲属性です。Amazon DynamoDBは、ハッシュ主キー属性に順序付けされていないハッシュインデックスを作成し、範囲主キー属性に並べ替えられた範囲インデックスを作成します[強調鉱山]

次に、この範囲インデックスを使用して、オプションでQuery APIRangeKeyConditionパラメーターを介してアイテムを要求し、 ScanIndexForwardパラメーターを介してインデックスの順方向または逆方向のトラバーサル(つまり、並べ替え方向)を指定できます。

更新:同じ方法で、ローカルセカンダリインデックスを持つ属性で並べ替えることができます。

于 2012-02-15T17:42:50.890 に答える
44

sort-key を使用し、クエリで 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));
    }
});
于 2016-04-27T07:46:58.030 に答える
8

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());
    }
}
于 2017-05-29T10:16:37.453 に答える
1

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 は結果をソートキー値の逆順で読み取り、結果をクライアントに返します。

于 2016-07-06T04:18:31.827 に答える