2012-01-23 25 views
14

Pregunta de Amazon AWS DynamoDB.Consulta de DynamoDB con operadores de comparación

¿Hay algún ejemplo del uso de RangeKeyCondition y ComparisonOperators como CONTAINS, IN, BETWEEN? Estoy intentando recuperar datos basados ​​en un RangeKey compuesto (concatenado y delimitado). Por ejemplo, fecha + autor + palabras clave para la tabla de libros. Supongamos que HashValue es "libro" en este caso (puede ser libro, dvd, video, enlace, etc.). Me gustaría seleccionar todos los libros que contengan la palabra clave "magia" o todos los libros del autor "John Doe". Un registro/artículo de muestra se vería así:

Hash ------ Rango ---------------------------- ------------------------------------- atributo1 ... atributox

libro --- --- 2012-1-20 ~ john doe ~ aventura ~ magia ~ viaje ---------------- descripción ... algunas cosas

Al tratar de usar el operador condicional EN o CONTIENE, obtengo el siguiente error: objeto (CFSimpleXML) 20 public '__type' => cadena 'com.amazon.coral.validate # ValidationException' (longitud = 45) public 'message' => cadena 'Intento restricción condicional no es una operación indexable '

No se encontraron ejemplos con estos operadores de comparación. Cualquier ayuda sería muy apreciada.

Gracias.

Respuesta

34

Es importante darse cuenta de la diferencia entre las dos API de búsqueda Query and Scan in Amazon DynamoDB:

  • de consulta

    A query operation searches only primary key attribute values and supports a subset of comparison operators on key attribute values to refine the search process. A query returns all of the item data for the matching primary keys (all of each item's attributes) up to 1MB of data per query operation. [...]

    [..] For information about each comparison operator available for query operations, see the API entry for Query .

    [emphasis mine]

  • Scan

    A scan operation scans the entire table. You can specify filters to apply to the results to refine the values returned to you, after the complete scan. Amazon DynamoDB puts a 1MB limit on the scan (the limit applies before the results are filtered). [...]

    [...] For information about each comparison operator available for scan operations, see the API entry for Scan .

Ahora, el Do subconjunto documentado para RangeKeyCondition: ComparisonOperator de Query API excluyeCONTAINS y IN, que están ambos disponibles dentro de Scan API; solo el operador de comparación BETWEEN está disponible dentro de ambas API.

Esta limitación probablemente proviene de consideraciones de rendimiento, es decir, si se admite CONTAINS, probablemente se superará el objetivo DynamoDB de rendimiento/rendimiento predecible.

Como es habitual con las soluciones NoSQL, deberá tener en cuenta estas limitaciones adaptando el diseño de su aplicación en consecuencia, es decir, abordando tanto su caso de uso como la arquitectura específica NoSQL a la que se dirige.

¡Buena suerte!

+8

Gracias Stefen. Usted es absolutamente correcto. Desafortunadamente, hubo un error en la documentación del desarrollador de AWS que muestra que estos operadores también están disponibles para Query. – user573306

Cuestiones relacionadas