1. ホーム
  2. database

[解決済み] DynamoDBからアイテム数を取得するには?

2023-01-12 04:32:10

質問

DynamoDBのクエリでアイテム数を知りたいのですが。

DynamoDBへの問い合わせは可能ですが、「アイテムの総数」のみを知りたいのです。

例えば、MySQLで「SELECT COUNT(*) FROM ... WHERE ...」とする。

$result = $aws->query(array(
 'TableName' => 'game_table',
 'IndexName' => 'week-point-index',
 'KeyConditions' => array(
    'week' => array(
        'ComparisonOperator' => 'EQ',
        'AttributeValueList' => array(
            array(Type::STRING => $week)
        )
    ),
    'point' => array(
        'ComparisonOperator' => 'GE',
        'AttributeValueList' => array(
            array(Type::NUMBER => $my_point)
        )
    )
 ),
));
echo Count($result['Items']);

このコードは、全ユーザーのデータを私のポイントより高く取得します。

もし$resultのカウントが100,000であれば、$resultは大きすぎます。 また、クエリサイズの制限を超えることになります。

助けが必要です。

どのように解決するのですか?

あなたは Select パラメータを使用し COUNT をリクエストに追加します。これは、マッチしたアイテムそのものではなく、マッチしたアイテムの数を返します"。 重要 は、提起されたように コメントでSaumitra R. Bhaveによってもたらされた , Query 結果セットのサイズが 1 MB より大きい場合、ScannedCount と Count は全アイテムの一部のカウントのみを表します。すべての結果を取得するために、複数の Query 操作を実行する必要があります。 .

私はPHPに詳しくないのですが、Javaで使用する方法を紹介します。そして、代わりに Count (これはPHPの関数だと推測されます)の上で 'Items' を使用すると Count の値を使用します。 - $result['Count'] :

final String week = "whatever";
final Integer myPoint = 1337;
Condition weekCondition = new Condition()
        .withComparisonOperator(ComparisonOperator.EQ)
        .withAttributeValueList(new AttributeValue().withS(week));
Condition myPointCondition = new Condition()
        .withComparisonOperator(ComparisonOperator.GE)
        .withAttributeValueList(new AttributeValue().withN(myPoint.toString()))

Map<String, Condition> keyConditions = new HashMap<>();
keyConditions.put("week", weekCondition);
keyConditions.put("point", myPointCondition);

QueryRequest request = new QueryRequest("game_table");
request.setIndexName("week-point-index");
request.setSelect(Select.COUNT);
request.setKeyConditions(keyConditions);

QueryResult result = dynamoDBClient.query(request);
Integer count = result.getCount();

をエミュレートする必要がない場合は WHERE 節をエミュレートする必要がなければ DescribeTable というリクエストで の結果としてのアイテム数を見積もることができます。

指定したテーブルのアイテム数です。DynamoDBはこの値を約6時間ごとに更新します。最近の変更はこの値に反映されていない可能性があります。

また、重要な注意点として ドキュメント に書かれているように サウミトラ R. バーヴェ がこの回答に対するコメントで指摘しています。

のサイズが小さいと Query の結果セットのサイズが 1 MB より大きい場合。 ScannedCountCount は全項目の部分的なカウントを表しているに過ぎません。複数の Query 操作を複数回行なう必要があります ( テーブル・クエリの結果をページ分割する ).