2012-05-04 21 views
18

Tengo una tabla llamada productos con clave principal Id. Quiero seleccionar todos los elementos en la tabla. Este es el código que estoy usando:¿Cómo puedo obtener todos los elementos de una tabla DynamoDB sin especificar la clave principal?

$batch_get_response = $dynamodb->batch_get_item(array(
    'RequestItems' => array(

     'products' => array(
      'Keys' => array(
       array(// Key #1 
        'HashKeyElement' => array(AmazonDynamoDB::TYPE_NUMBER => '1'), 
        'RangeKeyElement' => array(AmazonDynamoDB::TYPE_NUMBER => $current_time), 
       ), 
       array(// Key #2 
        'HashKeyElement' => array(AmazonDynamoDB::TYPE_NUMBER => '2'), 
        'RangeKeyElement' => array(AmazonDynamoDB::TYPE_NUMBER => $current_time), 
       ), 
      ) 
     ) 
    ) 
)); 

¿Es posible seleccionar todos los elementos sin especificar la clave principal? Estoy usando AWS SDK para PHP.

Respuesta

30

Amazon DynamoDB proporciona la operación Scan para este fin, que devuelve uno o más elementos y sus atributos mediante la realización de un análisis completo de una tabla. Tenga en cuenta las dos restricciones siguientes:

  • Dependiendo del tamaño de la tabla, puede que tenga que utilizar la paginación para recuperar todo el conjunto de resultados:

    Nota
    Si el número total de elementos escaneados excede el límite de 1 MB, el escaneo se detiene y los resultados se devuelven al usuario con LastEvaluatedKey para continuar el escaneo en una operación posterior. Los resultados también incluyen el número de elementos que exceden el límite. Un escaneo puede dar como resultado que no haya datos de tabla que cumplan los criterios de filtro.

    El conjunto de resultados es finalmente coherente.

  • La operación de escaneado es potencialmente costoso en relación con las dos unidades de rendimiento y capacidad consumida (es decir, precios), véase la sección Scan y rendimiento de las consultas enQuery and Scan in Amazon DynamoDB:

    [...] Además, como se una mesa crece, la operación de escaneo se ralentiza. La operación de escaneo examina cada elemento para los valores solicitados, y puede usar hasta el rendimiento previsto para una tabla grande en una sola operación. Para tiempos de respuesta más rápidos, diseñe sus tablas de forma que puedan usar las API Query, Get o BatchGetItem. O bien, diseñe su aplicación para usar las operaciones de escaneo de una manera que minimice el impacto en la tasa de solicitud de su mesa. Para obtener más información, consulte Provisioned Throughput Guidelines in Amazon DynamoDB. [el énfasis es mío]

Puede encontrar más detalles sobre esta operación y algunos fragmentos de ejemplo en Scanning Tables Using the AWS SDK for PHP Low-Level API for Amazon DynamoDB, con el más sencillo ejemplo ilustra el bienestar operación:

$dynamodb = new AmazonDynamoDB(); 

$scan_response = $dynamodb->scan(array(
    'TableName' => 'ProductCatalog' 
)); 

foreach ($scan_response->body->Items as $item) 
{ 
    echo "<p><strong>Item Number:</strong>" 
     . (string) $item->Id->{AmazonDynamoDB::TYPE_NUMBER}; 
    echo "<br><strong>Item Name: </strong>" 
     . (string) $item->Title->{AmazonDynamoDB::TYPE_STRING} ."</p>"; 
} 
+0

¿es posible agregar condición en la consulta? – Warrior

+0

Sí, consulte la sección _Request_ para [Scan] (http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_Scan.html), 'ScanFilter: ComparisonOperator' proporciona un resumen de lo que puede hacer.Dependiendo de su escenario, es posible que desee consultar [Consulta] (http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_Query.html), que generalmente es preferible tanto por razones de rendimiento como de costo (pero requiere una clave principal), como se indica en [Consultar y escanear en Amazon DynamoDB] (http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/QueryAndScan.html). –

+0

¿puedes ver mi nueva pregunta? http://stackoverflow.com/questions/10477996/writing-complex-queries-in-amazone-dynamo-dbmathematical-expressions – Warrior

0

voy a buscar todos elementos de dynamodb con la siguiente consulta. Funciona bien. creo estas funciones genéricas en zend framework y accedo a estas funciones sobre el proyecto.

 public function getQuerydata($tablename, $filterKey, $filterValue){ 
      return $this->getQuerydataWithOp($tablename, $filterKey, $filterValue, 'EQ'); 
     } 

     public function getQuerydataWithOp($tablename, $filterKey, $filterValue, $compOperator){ 
     $result = $this->getClientdb()->query(array(
       'TableName'  => $tablename, 
       'IndexName'  => $filterKey, 
       'Select'  => 'ALL_ATTRIBUTES', 
       'KeyConditions' => array(
        $filterKey => array(
         'AttributeValueList' => array(
          array('S' => $filterValue) 
         ), 
       'ComparisonOperator' => $compOperator 
      ) 
      ) 
     )); 
      return $result['Items']; 
     } 

     //Below i Access these functions and get data. 
     $accountsimg = $this->getQuerydataWithPrimary('accounts', 'accountID',$msgdata[0]['accountID']['S']); 
+0

¿Cuántos registros hay en su base de datos? Hay un límite de 1 MB, parece que esto funcionaría muy bien para bases de datos más pequeñas, pero no obtendría todo si tuviera datos importantes allí. –

+0

puede usar los parámetros de límite que proporciona Amazon db cuando obtiene registros de más de 1 MB. –

+0

desde http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#FilteringResults: "Una operación única de Query o Scan puede recuperar un máximo de 1 MB de datos. Este límite se aplica antes de cualquier expresión de filtro se aplica a los resultados. " –

Cuestiones relacionadas