是否可以在DynamoDB中使用查询或扫描对结果进行ORDER?

Sam*_*gru 66 amazon-dynamodb

是否可以在DynamoDB中使用Query或Scan API对结果进行ORDER?

我需要知道DynamoDB是否有来自SQL查询的[ORDER BY'field']?

谢谢.

Ste*_*pel 40

但是,没有明确说明,许多现实世界的用例显然需要排序,并且可以通过哈希和范围类型主键相应地建模:

在这种情况下,主键由两个属性组成.第一个属性是哈希属性,第二个属性是范围属性.Amazon DynamoDB在哈希主键属性上构建无序哈希索引,并在范围主键属性上构建有序范围索引.[强调我的]

然后,可以使用该范围内的索引经由任选请求项RangeKeyCondition所述的参数查询API和指定索引的向前或向后遍历通过(即排序方向)ScanIndexForward参数.

更新:您可以通过具有本地二级索引的属性以相同的方式进行排序.

  • ScanIndexForward参数似乎只适用于[查询](http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_Query.html),而不适用于[Scan](http://docs.amazonwebservices.com/amazondynamodb/最新/ developerguide/API_Scan.html)对吗?如何使用Query返回表中所有项的有序分页列表?扫描似乎是返回"*"的方式,但它似乎没有用于排序结果的参数. (17认同)
  • 重要问题:返回的结果实际上不会被排序。仅当您应用“限制”值或项目数量超过 1MB 查找限制时,排序才会发挥作用。例如,您可能有 5 条记录,分区键为“p1”,排序键为:[“b”、“d”、“a”、“c”、“e”]。如果您仅对“p1”执行查询,您将收到 ['b', 'd', 'a', 'c', 'e']。但如果您指定 Limit 为 2,它将返回 ['b', 'a'] (2认同)

kom*_*ten 20

您可以使用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));
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 问题是如果你想要返回*all*项目.从本质上讲,这意味着您必须创建一个新的虚拟列,在其中为所有行分配相同的值,在该列上创建GSI,以及调用查询而不是扫描. (5认同)

ABH*_*HRI 6

使用ScanIndexForward(true表示升序,false表示降序),也可以使用Query Expression的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());
    }
}
Run Code Online (Sandbox Code Playgroud)


rad*_*erg 5

我从未想过这样一个微不足道的任务会在 DynamoDB 中变成一个问题。Dynamo 需要一些基本分区。我设法通过添加额外的列状态来排序数据,然后使用这两个字段创建 GSI 索引。我通过createdAt字段订购status=“active”的数据。

创建GSI

{
        IndexName: "createdAt",
        KeySchema: [
            { AttributeName: "status", KeyType: "HASH" },
            { AttributeName: "createdAt", KeyType: "RANGE" }
        ],
        Projection: { ProjectionType: "ALL" },
        ProvisionedThroughput: {
          ReadCapacityUnits: N,
          WriteCapacityUnits: N
        }
      }
Run Code Online (Sandbox Code Playgroud)

查询数据

const result = await this.dynamoClient.query({
  TableName: "my table",
  IndexName: "createdAt",
  KeyConditionExpression: "#status = :status and #createdAt > :createdAt",
  Limit: 5,
  ExpressionAttributeValues: {
    ":status": {
      "S": "active"
    },
    ":createdAt": {
      "S": "2020-12-10T15:00:00.000Z"
    }
  },
  ExpressionAttributeNames: {
    "#status": "status",
    "#createdAt": "createdAt"
  },
});
Run Code Online (Sandbox Code Playgroud)