2012-05-04 22 views
18

Tôi có một bảng gọi là sản phẩm có khóa chính Id. Tôi muốn chọn tất cả các mục trong bảng. Đây là mã tôi đang sử dụng:Làm cách nào để lấy tất cả các mục từ bảng DynamoDB mà không chỉ định khóa chính?

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

Có thể chọn tất cả các mục mà không chỉ định khóa chính không? Tôi đang sử dụng SDK AWS cho PHP.

Trả lời

30

Amazon DynamoDB cung cấp hoạt động Scan cho mục đích này, trong đó trả về một hoặc nhiều mục và thuộc tính của nó bằng cách thực hiện quét toàn bộ bảng. Xin lưu ý của hai khó khăn sau đây:

  • Tùy thuộc vào kích thước bảng, bạn có thể cần phải sử dụng pagination để lấy toàn bộ tập kết quả:

    Note
    Nếu tổng số các mục được quét vượt quá giới hạn 1MB, các lần quét quét sẽ được trả lại cho người dùng bằng LastEvaluatedKey để tiếp tục quá trình quét trong hoạt động tiếp theo. Các kết quả cũng bao gồm số mục vượt quá giới hạn. Quét có thể dẫn đến việc không có dữ liệu bảng nào đáp ứng tiêu chí lọc.

    Tập hợp kết quả cuối cùng nhất quán.

  • Các hoạt động Scan có khả năng gây tốn kém về cả hai đơn vị thực hiện và khả năng tiêu thụ (ví dụ giá), xem phần Scan và Hiệu suất Truy vấn trong Query and Scan in Amazon DynamoDB:

    [...] Ngoài ra, như một bảng phát triển, hoạt động quét chậm. Thao tác quét kiểm tra mọi mục đối với các giá trị được yêu cầu và có thể sử dụng hết thông lượng được cung cấp cho một bảng lớn trong một thao tác đơn lẻ. Để có thời gian phản hồi nhanh hơn, hãy thiết kế các bảng của bạn theo cách có thể sử dụng các API truy vấn, Nhận hoặc BatchGetItem thay vào đó là . Hoặc, thiết kế ứng dụng của bạn để sử dụng các thao tác quét theo cách giảm thiểu tác động trên tốc độ yêu cầu của bảng. Để biết thêm thông tin, xem Provisioned Throughput Guidelines in Amazon DynamoDB. [tôi nhấn mạnh]

Bạn có thể tìm thêm chi tiết về hoạt động này và một số đoạn trong Scanning Tables Using the AWS SDK for PHP Low-Level API for Amazon DynamoDB, với ví dụ đơn giản nhất minh họa phúc hoạt động:

$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

có thể thêm điều kiện trong truy vấn không? – Warrior

+0

Có, hãy kiểm tra phần _Request_ cho [Quét] (http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_Scan.html), 'ScanFilter: ComparOperator' cung cấp tóm tắt về những gì bạn có thể làm.Tùy thuộc vào kịch bản của bạn, bạn có thể muốn xem xét [Truy vấn] (http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_Query.html), điều này thường thích hợp hơn cả vì lý do hiệu suất và chi phí (nhưng yêu cầu khóa chính), như được đề cập trong [Truy vấn và Quét trong Amazon DynamoDB] (http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/QueryAndScan.html). –

+0

bạn có thể nhìn vào câu hỏi mới của mình không? http://stackoverflow.com/questions/10477996/writing-complex-queries-in-amazone-dynamo-dbmathematical-expressions – Warrior

0

tôi lấy tất cả các mục từ dynamodb với truy vấn sau đây. Nó hoạt động tốt. tôi tạo ra các chức năng chung trong khuôn khổ zend và truy cập các chức năng này trong dự án.

 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

Có bao nhiêu hồ sơ trong cơ sở dữ liệu của bạn? Có một giới hạn 1MB, có vẻ như điều này sẽ làm việc tuyệt vời cho cơ sở dữ liệu nhỏ hơn, nhưng sẽ không nhận được tất cả mọi thứ nếu bạn có một số dữ liệu đáng kể trong đó. –

+0

bạn có thể sử dụng các thông số giới hạn mà amazon db cung cấp khi bạn nhận được các bản ghi lớn hơn 1 MB. –

+0

Từ http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#FilteringResults: "Một truy vấn hoặc hoạt động Quét có thể truy xuất tối đa 1 MB dữ liệu. Giới hạn này áp dụng trước bất kỳ biểu thức lọc nào được áp dụng cho kết quả. " –

Các vấn đề liên quan