web-dev-qa-db-ja.com

主キーを指定せずにDynamoDBテーブルからすべてのアイテムをフェッチするにはどうすればよいですか?

主キーIdを持つ製品というテーブルがあります。テーブル内のすべてのアイテムを選択したい。これは私が使用しているコードです:

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

主キーを指定せずにすべてのアイテムを選択することは可能ですか? PHP用AWS SDKを使用しています。

32
Warrior

Amazon DynamoDB は、この目的のために Scan 操作を提供します。これは、1つ以上のアイテムとその属性を実行して、テーブルの完全スキャン。次の2つの制約に注意してください。

  • テーブルサイズによっては、ページネーションを使用して結果セット全体を取得する必要がある場合があります。


    スキャンされたアイテムの合計数が1MBの制限を超えると、スキャンが停止し、結果がLastEvaluatedKeyとともにユーザーに返されて、後続の操作でスキャンが続行されます。結果には、制限を超えるアイテムの数も含まれます。スキャンの結果、フィルター基準を満たす表データがなくなる場合があります。

    結果セットは最終的に一貫しています。

  • スキャン操作は、パフォーマンスと消費される容量ユニット(つまり価格)の両方に関してコストがかかる可能性があります。セクションスキャンおよびクエリパフォーマンス in クエリおよびAmazon DynamoDBでのスキャンを参照してください

    [...]また、テーブルが大きくなると、スキャン操作が遅くなります。スキャン操作は、要求された値のすべてのアイテムを検査し、1回の操作で大きなテーブルのプロビジョニングされたスループットを使い果たすことができます。応答時間を短縮するには、代わりにQuery、Get、またはBatchGetItem APIを使用できる方法でテーブルを設計します。または、テーブルの要求率への影響を最小限に抑える方法でスキャン操作を使用するようにアプリケーションを設計します。詳細については、「 Amazon DynamoDBのプロビジョニングされたスループットのガイドライン 」を参照してください。 [emphasis mine]

この操作の詳細とスニペットの例については、 PHP Amazon DynamoDBの低レベルAPIのAWS SDKを使用したテーブルのスキャン 、操作を示す最も簡単な例は次のとおりです。

$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>";
}
45
Steffen Opel

次のクエリを使用して、dynamodbからすべてのアイテムをフェッチします。正常に動作します。これらの汎用関数をzendフレームワークで作成し、プロジェクトを介してこれらの関数にアクセスします。

        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
Hassan Raza