是否可以在DynamoDB中使用Query或Scan API对结果进行ORDER?
我需要知道DynamoDB是否有来自SQL查询的[ORDER BY'field']?
谢谢.
Ste*_*pel 40
但是,没有明确说明,许多现实世界的用例显然需要排序,并且可以通过哈希和范围类型主键相应地建模:
在这种情况下,主键由两个属性组成.第一个属性是哈希属性,第二个属性是范围属性.Amazon DynamoDB在哈希主键属性上构建无序哈希索引,并在范围主键属性上构建有序范围索引.[强调我的]
然后,可以使用该范围内的索引经由任选请求项RangeKeyCondition所述的参数查询API和指定索引的向前或向后遍历通过(即排序方向)ScanIndexForward参数.
更新:您可以通过具有本地二级索引的属性以相同的方式进行排序.
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)
使用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)
我从未想过这样一个微不足道的任务会在 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)
归档时间: |
|
查看次数: |
70875 次 |
最近记录: |