28

dynamodb テーブルにある項目の数を知りたいです。APIガイドから、それを行う1つの方法は、次のようにスキャンを使用することです:

<?php
$dynamodb = new AmazonDynamoDB();

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

echo "Total number of items: ".count($scan_response->body->Items)."\n";

ただし、これはすべてのアイテムをフェッチし、それらをメモリ内の配列に格納する必要があり、ほとんどの場合、私が推測することはできません。総アイテム数をより効率的に取得する方法はありますか?

このデータは AWS Dynamo Web コンソールでは利用できません。私はすでに確認しました。(最初はページネーション ボタンと一緒に表示されているように見えますが、アイテムの次のページに進むにつれて数字が大きくなることがわかります)。

4

9 に答える 9

14

このCountオプションは間違いなく必要なものですが、スキャン結果に結果の「ページ」が 1 つ以上ある可能性があることも考慮する必要があります。Scan オペレーションは一度にテーブル内の 1MB のデータのみをスキャンするためCount、結果の値はテーブルの最初の 1MB のカウントのみを反映します。結果の値を使用して、後続のリクエストを行う必要がありますLastEvaluatedKey(存在する場合)。そのようなことを行うためのサンプルコードを次に示します。

<?php

$dynamo_db = new AmazonDynamoDB();

$total = 0;
$start_key = null;
$params = array(
    'TableName' => 'my-table',
    'Count'     => true
);

do {
    if ($start_key) {
        $params['ExclusiveStartKey'] = $start_key->getArrayCopy();
    }

    $response = $dynamo_db->scan($params);

    if ($response->isOK()) {
        $total += (string) $response->body->Count;

        if ($response->body->LastEvaluatedKey) {
            $start_key = $response->body->LastEvaluatedKey->to_array();
        } else {
            $start_key = null;
        }
    }
} while ($start_key);

echo "Count: {$total}";
于 2012-10-05T15:49:35.203 に答える
7

ああ、APIにはCountオプションがあります。http://docs.amazonwebservices.com/AWSSDKforPHP/latest/#m=AmazonDynamoDB/scanを参照してください。scan

<?php
$dynamodb = new DynamoMetadata();

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

echo "Count: ".$scan_response->body->Count."\n";
于 2012-09-19T17:32:28.383 に答える
5

アプリケーションのロジックでテーブル内のアイテムの総数を使用することに関心がある場合は、かなり頻繁に総数を照会することになります。これを実現する 1 つの方法は、スキャン操作を使用することです。ただし、スキャン操作は文字通りテーブル全体をスキャンするため、大量のスループットを消費することに注意してください。そのため、すべてのクエリ操作がその期間にスロットル例外を受け取ります。また、スキャンによって結果のカウントが 1 MB のサイズに制限されるという事実を考慮しても、テーブルが非常に大きい場合は、アイテムの実際の数を取得するために繰り返しスキャン操作を行う必要があります。これには、カスタム クエリ ロジックを記述し、クエリ操作で避けられないスロットリングを処理する必要があります。

私の頭に浮かぶより良い解決策は、そのようなテーブルのアイテム数の合計数を別のテーブルに維持することです。各アイテムは、ハッシュキーとしてテーブル名を持ち、そのテーブル内のアイテムの総数を非キー属性として持ちます. 次に、特定のテーブルの合計アイテム数を増減するアトミック更新操作を行うことにより、「TotalNumberOfItemsPerTable」という名前のこのテーブルを更新したままにすることができます。

スロットリングや 1MB 制限の問題はありません。

さらに、この概念をさらに細かく拡張することもできます。たとえば、ハッシュ キーまたは任意の条件に一致するアイテムの総数を維持し、文字列形式でエンコードして、"TotalNumberOfItemsInSomeCollection" や " TotalNumberOfItemsMatchingSomeCriteria". これらのテーブルには、テーブルごと、コレクションごと、またはいくつかの基準に一致するアイテムごとのアイテム数のエントリを含めることができます。

于 2013-09-18T04:53:28.163 に答える
3

DynamoDB の AWS コンソールで、おおよそのアイテム数の値 (6 時間ごとに更新されると想定されます) を確認できます。テーブルを選択して [詳細] タブを確認すると、最後のエントリは [項目数] です。これが機能する場合は、カウントを行うためにテーブルのスループットを消費することを避けることができます。

于 2013-04-01T15:43:52.230 に答える