¿Es posible ORDENAR resultados con Query o Scan API en DynamoDB?¿Es posible ORDENAR resultados con consulta o escaneo en DynamoDB?
Necesito saber si DynamoDB tiene algo así como [ORDER BY 'field'] de consultas SQL?
Gracias.
¿Es posible ORDENAR resultados con Query o Scan API en DynamoDB?¿Es posible ORDENAR resultados con consulta o escaneo en DynamoDB?
Necesito saber si DynamoDB tiene algo así como [ORDER BY 'field'] de consultas SQL?
Gracias.
no explícitamente, sin embargo, el pedido es obviamente necesario para muchos casos de uso del mundo real y se puede modelar mediante el Hash and Range Type Primary Key en consecuencia:
En este caso, la clave principal está hecho de dos atributos. Los primeros atributos son el atributo hash y el segundo es el atributo . Amazon DynamoDB crea un índice de hash desordenado en el atributo de clave principal hash y un índice de rango ordenado en el atributo de clave principal de rango. [énfasis mío]
continuación, puede utilizar este índice gama opcionalmente elementos de solicitud a través de la parámetro RangeKeyCondition de la Query API y especificar hacia adelante o de recorrido hacia atrás del índice (es decir, la dirección de ordenación) a través de el parámetro ScanIndexForward.
Actualización: Puede ordenar por un atributo con un local secondary index de la misma manera.
Puede usar la clave de clasificación y aplicar el parámetro ScanIndexForward en un query para ordenar en orden ascendente o descendente. Aquí puedo limitar los artículos vueltos a 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));
}
});
El problema es si desea devolver * todos * elementos. Básicamente, eso significa que debe crear una nueva columna ficticia, asignarle el mismo valor a todas las filas, crear un GSI en esa columna y realizar una consulta en lugar de escanear. – JHH
Si está utilizando boto2 y usted tiene la clave de ordenación en una de las columnas en la tabla, se puede ordenar lo que se recuperan en orden o en orden inverso por diciendo:
result = users.query_2(
account_type__eq='standard_user',
reverse=True)
Si está utilizando boto3 y usted tiene la clave de ordenación en la columna que desea ordenar el resultado por, puede ordenar los datos se recuperan diciendo:
result = users.query(
KeyConditionExpression=Key('account_type').eq('standard_user'),
ScanIndexForward=True)
Recuerde en boto3 si ScanIndexForward es verdadero, DynamoDB devuelve los resultados en el orden en que se almacenan (por el valor de la clave de clasificación). Este es el comportamiento predeterminado. Si ScanIndexForward es falso, DynamoDB lee los resultados en orden inverso ordenando el valor de la clave, y luego devuelve los resultados al cliente.
Use ScanIndexForward (true para ascendente y falso para descendente) y también puede limitar el resultado utilizando setLimit value of Query Expression.
A continuación, encontrará el código donde se utilizó QueryPage para buscar el registro individual.
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());
}
}
Utilice ScanIndexForward (verdadero para ascendente y falso para descendente) –
El parámetro ScanIndexForward parece aplicarse únicamente a [Consulta] (http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_Query.html), no [Scan] (http: // docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_Scan.html) ¿correcto? ¿Cómo se podría devolver una lista paginada ordenada de todos los artículos en una tabla usando Query? El escaneo parece ser la forma de devolver "*", pero no parece tener un parámetro para ordenar los resultados. – case2000
No he usado esta característica, solo leí al respecto, pero Query admite especificar un [Límite] (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#ScanQueryLimit), para limitar la cantidad de resultados recibidos, y si hay más elementos que coinciden con su consulta cuando se alcanza el límite, recibirá una _LastEvaluatedKey_ que se puede usar para realizar otra consulta y seguir recuperando resultados. – fernio