2012-05-04 10 views
18

Mam tabelę o nazwie produkty z kluczem podstawowym Id. Chcę wybrać wszystkie pozycje w tabeli. Jest to kod, którego używam:Jak mogę pobrać wszystkie elementy z tabeli DynamoDB bez określania klucza podstawowego?

$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), 
       ), 
      ) 
     ) 
    ) 
)); 

Czy można wybrać wszystkie elementy bez podawania klucza podstawowego? Używam pakietu SDK AWS dla PHP.

Odpowiedz

30

Amazon DynamoDB zapewnia działanie Scan do tego celu, który zwraca jeden lub więcej elementów i atrybutów, wykonując pełny skan tabeli. Należy zdawać sobie sprawę z dwóch następujących ograniczeń:

  • zależności od wielkości stołu, może trzeba użyć paginacji aby pobrać cały zestaw wyników:

    Uwaga
    Jeżeli łączna liczba zeskanowanych elementów przekracza limit 1 MB, skanowanie zatrzymuje się, a wyniki są zwracane użytkownikowi za pomocą klucza LastEvaluatedKey, aby kontynuować skanowanie w kolejnej operacji. Wyniki zawierają również liczbę elementów przekraczającą limit. Skanowanie może spowodować brak danych tabeli spełniających kryteria filtru.

    Zestaw wyników jest ostatecznie spójny.

  • Operacja skanowania jest potencjalnie kosztowne czasowo obie jednostki wydajności i spożywane pojemności (czyli cena), patrz punkt skanowania i kwerend w Query and Scan in Amazon DynamoDB Wydajność:

    [...] Ponadto, jak tabela rośnie, operacja skanowania spowalnia. Operacja skanowania analizuje każdy element dla żądanych wartości, a może wykorzystywać zwiększoną przepustowość dla dużej tabeli w jednej operacji. Aby uzyskać szybszy czas odpowiedzi, należy zaprojektować tabele w taki sposób, aby zamiast nich można było używać interfejsów API Query, Get lub BatchGetItem. Lub zaprojektuj swoją aplikację , aby używać operacji skanowania w sposób minimalizujący wpływ na stawkę żądania tabeli. Aby uzyskać więcej informacji, zobacz Provisioned Throughput Guidelines in Amazon DynamoDB. [podkr]

można znaleźć więcej szczegółów na temat tej operacji i przykładowe fragmenty w Scanning Tables Using the AWS SDK for PHP Low-Level API for Amazon DynamoDB z najbardziej prosty przykład ilustrujący istotę pracy:

$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

Czy można dodać warunek do zapytania? – Warrior

+0

Tak, sprawdź sekcję _Request_ dla [Skanowanie] (http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_Scan.html), 'ScanFilter: ComparisonOperator' zawiera podsumowanie tego, co możesz zrobić.W zależności od scenariusza możesz również zajrzeć do [Zapytanie] (http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_Query.html), co jest zazwyczaj preferowane zarówno ze względu na wydajność, jak i koszty (ale wymaga klucza podstawowego), jak opisano w [Query and Scan in Amazon DynamoDB] (http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/QueryAndScan.html). –

+0

możesz spojrzeć na moje nowe pytanie? http://stackoverflow.com/questions/10477996/writing-complex-queries-in-amazone-dynamo-dbmathematical-expressions – Warrior

0

I pobrać wszystkie elementy z dynamodb z następującym zapytaniem. To działa dobrze. Tworzę te funkcje jako ogólne w Zend Framework i uzyskujemy dostęp do tych funkcji w projekcie.

 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

Ile rekordów znajduje się w bazie danych? Limit wynosi 1MB, wydaje się, że dobrze by to działało w przypadku mniejszych baz danych, ale nie dostałby wszystkiego, gdybyś miał tam jakieś istotne dane. –

+0

możesz użyć parametrów limitów, które amazon db zapewnia, gdy otrzymasz rekordy większe niż 1 MB. –

+0

Z http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#FilteringResults: "Pojedyncza operacja zapytania lub skanowania może pobrać maksymalnie 1 MB danych. Ograniczenie to obowiązuje przed każdym wyrażeniem filtru jest stosowany do wyników. –

Powiązane problemy