63

主キー を持つ products というテーブルがあります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),
                ),
            )
        )
    )   
));

主キーを指定せずにすべての項目を選択することはできますか? AWS SDK for PHP を使用しています。

4

7 に答える 7

71

Amazon DynamoDBは、この目的のためにScanオペレーションを提供します。このオペレーションは、テーブルのフル スキャンを実行して 1 つ以上の項目とその属性を返します。次の 2 つの制約に注意してください。

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

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

    結果セットは最終的に整合性があります。

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

    [...] また、テーブルが大きくなると、スキャン操作が遅くなります。スキャン操作は、要求された値についてすべてのアイテムを調べ、単一の操作で大きなテーブルのプロビジョニングされたスループットを使い果たす可能性があります。応答時間を短縮するには、代わりに Query、Get、または BatchGetItem API を使用できるようにテーブルを設計します。または、テーブルのリクエスト レートへの影響を最小限に抑える方法でスキャン操作を使用するようにアプリケーションを設計します。詳細については、Amazon DynamoDB のプロビジョニング済みスループットのガイドライン を参照してください。[鉱山を強調]

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

$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>";
}
于 2012-05-04T15:17:36.650 に答える
2

次のクエリを使用して、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']);
于 2015-06-05T12:05:39.377 に答える
-2

この C# コードは、BatchGet または CreateBatchGet を使用して dynamodb テーブルからすべての項目をフェッチすることです

        string tablename = "AnyTableName"; //table whose data you want to fetch

        var BatchRead = ABCContext.Context.CreateBatchGet<ABCTable>(  

            new DynamoDBOperationConfig
            {
                OverrideTableName = tablename; 
            });

        foreach(string Id in IdList) // in case you are taking string from input
        {
            Guid objGuid = Guid.Parse(Id); //parsing string to guid
            BatchRead.AddKey(objGuid);
        }

        await BatchRead.ExecuteAsync();
        var result = BatchRead.Results;

// ABCTable は、取得したいデータと dynamodb で作成するために使用されるテーブルモーダルです

于 2019-12-05T17:09:36.760 に答える