web-dev-qa-db-ja.com

DynamoDBからアイテム数を取得する方法は?

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は大きすぎます。また、クエリサイズの制限を超えます。

私は助けが必要です。

51
sam lee

Selectパラメーターを使用し、COUNT をリクエストで使用できます。 「一致するアイテム自体ではなく、一致するアイテムの数を返します」。 重要な、育ったまま by Saumitra R. Bhave in a comment "サイズがクエリ結果セットの1 MBより大きい場合、ScannedCountとCountは合計アイテムの部分カウントのみを表します。すべての結果を取得するには、複数のクエリ操作を実行する必要があります。 ".

私はPHPに慣れていませんが、Javaでそれを使用する方法は次のとおりです。そして、'Items'Count(PHPの関数だと推測しています)を使用する代わりに、応答から 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時間ごとに更新します。最近の変更はこの値に反映されない場合があります。

15
mkobit

aws dynamodb cli を使用すると、次のように scan で取得できます。

aws dynamodb scan --table-name <TABLE_NAME> --select "COUNT"

応答は次のようになります。

{
    "Count": 123,
    "ScannedCount": 123,
    "ConsumedCapacity": null
}

describe-table apiとは対照的に、この情報はリアルタイムであることに注意してください

106

UIからも見ることができます。表の概要タブに移動すると、アイテム数が表示されます。それが誰かを助けることを願っています。

5
coder007

ここにたどり着き、C#で作業している場合、次のコードを使用します。

var cancellationToken = new CancellationToken();

var request = new ScanRequest("TableName") {Select = Select.COUNT};

var result = context.Client.ScanAsync(request, cancellationToken).Result;

totalCount = result.Count;
4
ymerej

JavaのPHPと同様に、値 'COUNT'のSelect PARAMETERのみを設定します

$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)
        )
    )
 ),
 'Select' => 'COUNT'
));

このようにアクセスします:

echo $ result ['Count'];

ただし、上記のSaumitraのように、1 MBを超える結果セットには注意してください。その場合は、最後に更新されたカウント値を取得するためにnullを返すまでLastEvaluatedKeyを使用します。

1
jajhonrod

Scalaの場合:

import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder
import com.amazonaws.services.dynamodbv2.document.DynamoDB
val client = AmazonDynamoDBClientBuilder.standard().build()

val dynamoDB = new DynamoDB(client)
val tableDescription = dynamoDB.getTable("table name").describe().getItemCount()

Dynamodbマッパークエリを使用できます。

PaginatedQueryList<YourModel> list = DymamoDBMapper.query(YourModel.class, queryExpression);
int count = list.size();

allResultsLoadedまで次の利用可能な結果を​​遅延ロードするloadAllResults()を呼び出します。

参照: https://docs.amazonaws.cn/en_us/amazondynamodb/latest/developerguide/DynamoDBMapper.Methods.html#DynamoDBMapper.Methods.query

0
Feng Han