2012-02-15 89 views

Respuesta

26

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.

+13

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

+0

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

6

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)); 
    } 
}); 
+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

0

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.

2

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

Utilice ScanIndexForward (verdadero para ascendente y falso para descendente) –

Cuestiones relacionadas