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
をリクエストで使用できます。 「一致するアイテム自体ではなく、一致するアイテムの数を返します」。 重要な、育ったまま 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時間ごとに更新します。最近の変更はこの値に反映されない場合があります。
aws dynamodb cli を使用すると、次のように scan で取得できます。
aws dynamodb scan --table-name <TABLE_NAME> --select "COUNT"
応答は次のようになります。
{
"Count": 123,
"ScannedCount": 123,
"ConsumedCapacity": null
}
describe-table apiとは対照的に、この情報はリアルタイムであることに注意してください
UIからも見ることができます。表の概要タブに移動すると、アイテム数が表示されます。それが誰かを助けることを願っています。
ここにたどり着き、C#で作業している場合、次のコードを使用します。
var cancellationToken = new CancellationToken();
var request = new ScanRequest("TableName") {Select = Select.COUNT};
var result = context.Client.ScanAsync(request, cancellationToken).Result;
totalCount = result.Count;
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を使用します。
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()
を呼び出します。