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에 의해 , 쿼리 결과 집합의 크기가 1 MB보다 큰이가 “다음 ScannedCount 및 개수는 전체 항목의 부분적인 수를 나타냅니다. 여러를 수행해야합니다 모든 결과를 검색하기위한 쿼리 작업 “ .
저는 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 시간마다 업데이트합니다. 최근 변경 사항은이 값에 반영되지 않을 수 있습니다.
또한 Saumitra R. Bhave 가이 답변에 대한 의견에 언급 한 문서 의 중요한 참고 사항 :
크기의 경우
Query
결과 세트는 1 MB보다 큰이며,ScannedCount
그리고Count
전체 항목 중 일부만 카운트를 나타낸다.Query
모든 결과를 검색하려면 여러 작업 을 수행해야합니다 ( 테이블 쿼리 결과 페이지 매기기 참조 ).
답변
으로 AWS DynamoDB의 CLI 당신은을 통해 그것을 얻을 수 스캔 은 다음과 같습니다 :
aws dynamodb scan --table-name <TABLE_NAME> --select "COUNT"
응답은 다음과 유사합니다.
{
"Count": 123,
"ScannedCount": 123,
"ConsumedCapacity": null
}
이 정보는 describe-table api 와는 달리 실시간입니다.
답변
UI에서도 볼 수 있습니다. 테이블의 개요 탭으로 이동하면 항목 수를 볼 수 있습니다. 누군가에게 도움이되기를 바랍니다.
답변
테이블 이름을 바꾸고 아래 쿼리를 사용하여 로컬 환경에서 데이터를 가져옵니다.
aws dynamodb scan --table-name <TABLE_NAME> --select "COUNT" --endpoint-url http://localhost:8000
테이블 이름을 바꾸고 엔드 포인트 URL을 제거하여 프로덕션 환경에서 데이터를 가져옵니다.
aws dynamodb scan --table-name <TABLE_NAME> --select "COUNT"
답변
여기에 도달하고 C #으로 작업하는 경우 코드는 다음과 같습니다.
var cancellationToken = new CancellationToken();
var request = new ScanRequest("TableName") {Select = Select.COUNT};
var result = context.Client.ScanAsync(request, cancellationToken).Result;
totalCount = result.Count;
답변
PHP의 Java와 유사하게 ‘COUNT’값으로 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 [ ‘개수’];
로하지만 Saumitra는 위에서 언급 한 것이 마지막 업데이트 카운트 값을 얻을 널 (null)을 반환 때까지 그 경우 사용 LastEvaluatedKey에 1 MB보다 결과 집합의 largers에주의.
답변
dynamodb 매퍼 쿼리를 사용할 수 있습니다.
PaginatedQueryList<YourModel> list = DymamoDBMapper.query(YourModel.class, queryExpression);
int count = list.size();
그것은 부른다 loadAllResults()
allResultsLoaded 때까지 사용 가능한 다음 결과를 지연로드하는 합니다.