是否可以使用DynamoDB中的Query或Scan API对结果进行ORDER?
我需要从SQL查询中了解DynamoDB是否具有类似[ORDER BY'field']的内容吗?
谢谢。
是否可以使用DynamoDB中的Query或Scan API对结果进行ORDER?
我需要从SQL查询中了解DynamoDB是否具有类似[ORDER BY'field']的内容吗?
谢谢。
Answers:
您可以使用排序键,并在查询中应用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,并且在表中的某一列上具有排序键,则可以通过说以下顺序对检索到的内容进行排序:
result = users.query_2(
account_type__eq='standard_user',
reverse=True)
如果您使用的是boto3,并且您要对结果进行排序的列上具有排序键,则可以通过说出以下内容来对检索到的数据进行排序:
result = users.query(
KeyConditionExpression=Key('account_type').eq('standard_user'),
ScanIndexForward=True)
请记住,在boto3中,如果ScanIndexForward为true,则DynamoDB将按存储顺序(按排序键值)返回结果。这是默认行为。如果ScanIndexForward为false,则DynamoDB按排序键值以相反的顺序读取结果,然后将结果返回给客户端。
如果该表已经存在,则将GSI(全局二级索引)添加到该表所需的属性中,并使用“查询”而不是“扫描”。如果要创建表,则可以将LSI(本地二级索引)添加到所需的属性。