是否可以在DynamoDB中将结果与查询或扫描进行排序?

问题描述:

是否可以在DynamoDB中将结果与Query或Scan API进行排序?是否可以在DynamoDB中将结果与查询或扫描进行排序?

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

谢谢。

不明确,但是,显然需要订购了许多现实世界的使用情况,并通过相应的Hash and Range Type Primary Key来建模:

在这种情况下,主键由两个属性。第一个 属性是散列属性,第二个属性是范围 属性。 Amazon DynamoDB在散列 主键属性和排序范围索引上创建一个无序散列索引,范围主要为 关键属性[重点矿山]

然后可以使用该范围内的索引经由Query APIRangeKeyCondition参数可选地请求项和向前指定或通过指数(即排序方向)的向后遍历ScanIndexForward参数。

更新:您可以通过属性与相同的方式local secondary index订购。

+13

的ScanIndexForward PARAM似乎只适用于[查询](http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_Query.html),而不是[扫描](HTTP://文档。amazonwebservices.com/amazondynamodb/latest/developerguide/API_Scan.html)是否正确?如何使用Query返回表中所有项目的有序分页列表?扫描似乎是返回“*”的方式,但它似乎没有用于排序结果的参数。 – case2000 2012-02-15 20:20:22

+0

我没有使用过这个功能,只是阅读了它,但是Query支持指定一个[Limit](限制)收到的结果数量,以及在达到限制时是否有更多与您的查询匹配的项目,您将收到一个_LastEvaluatedKey_,可用于执行另一个查询并继续检索结果。 – fernio 2014-12-10 15:59:26

您可以使用排序键并应用query中的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)); 
    } 
}); 
+2

问题是如果你想返回*所有*项目。从本质上讲,这意味着您必须创建一个新的虚拟列,将相同的值分配给所有行,在该列上创建一个GSI,然后调用查询而不是扫描。 – JHH 2016-06-02 08:42:47

如果您正在使用boto2,你必须在你的表中的列的一个排序关键字,您可以排序你在顺序或按相反的顺序检索什么他说:

result = users.query_2(
    account_type__eq='standard_user', 
    reverse=True) 

如果您正在使用boto3,你必须对要由结果排序的列的排序键,你可以说你排序检索数据

记住boto3如果ScanIndexForward为true,那么DynamoDB会按照它们的存储顺序(按排序键值)返回结果。这是默认行为。如果ScanIndexForward为false,则DynamoDB会按排序键值的相反顺序读取结果,然后将结果返回给客户端。

使用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()); 
    } 
} 
+0

使用ScanIndexForward(true为升序,false为降序) – 2017-12-18 18:19:19