Как получить количество предметов из DynamoDB?
Я хочу знать количество элементов с запросом DynamoDB.
Я могу запросить DynamoDB, но я хочу знать только "общее количество элементов".
Например, "SELECT COUNT (*) FROM... WHERE..." в MySQL
$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, результат $слишком большой.
И это превысит пределы размера запроса.
Мне нужна помощь.
Ответы
Ответ 1
Вы можете использовать параметр Select
и использовать COUNT
в запросе. Он "возвращает количество подходящих элементов, а не сами соответствующие элементы". Важно, как упомянул Saumitra R. Bhave в комментарии: "Если размер набора результатов запроса превышает 1 МБ, то ScannedCount и Count будут представлять только частичное количество всех элементов. Вам нужно будет выполнить несколько Операции запроса для получения всех результатов ".
Я не знаком с 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 обновляет это значение примерно каждые шесть часов. Последние изменения могут не отражаться в этом значении.
Ответ 2
С aws dynamodb cli вы можете получить его через scan следующим образом:
aws dynamodb scan --table-name <TABLE_NAME> --select "COUNT"
Ответ будет выглядеть примерно так:
{
"Count": 123,
"ScannedCount": 123,
"ConsumedCapacity": null
}
обратите внимание, что эта информация находится в режиме реального времени в отличие от describe-table api
Ответ 3
Можно также увидеть из пользовательского интерфейса.
Перейдите на вкладку "Обзор" в таблице, вы увидите количество элементов. Надеюсь, это поможет кому-то.
Ответ 4
Если вы оказались здесь и работаете с С#, вот код:
var cancellationToken = new CancellationToken();
var request = new ScanRequest("TableName") {Select = Select.COUNT};
var result = context.Client.ScanAsync(request, cancellationToken).Result;
totalCount = result.Count;
Ответ 5
Подобно Java только в PHP, установите Select PARAMETER со значением 'COUNT'
$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 МБ, в этом случае используйте LastEvaluatedKey до тех пор, пока не будет получено последнее обновленное значение счетчика.
Ответ 6
Замените имя таблицы и используйте приведенный ниже запрос, чтобы получить данные о вашей локальной среде:
aws dynamodb scan --table-name <TABLE_NAME> --select "COUNT" --endpoint-url http://localhost:8000
Замените имя таблицы и удалите URL-адрес конечной точки, чтобы получить данные в производственной среде
aws dynamodb scan --table-name <TABLE_NAME> --select "COUNT"
Ответ 7
В 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()
Ответ 8
Вы можете использовать запрос динамического сопоставления.
PaginatedQueryList<YourModel> list = DymamoDBMapper.query(YourModel.class, queryExpression);
int count = list.size();
он вызывает loadAllResults()
, который будет лениво загружать следующий доступный результат до тех пор, пока allResultsLoaded.
Ref: https://docs.amazonaws.cn/en_us/amazondynamodb/latest/developerguide/DynamoDBMapper.Methods.html#DynamoDBMapper.Methods.query
Ответ 9
Я использовал сканирование, чтобы получить общее количество требуемого имени таблицы. Следующее - это фрагмент кода Java для тех же
Long totalItemCount = 0;
do{
ScanRequest req = new ScanRequest();
req.setTableName(tableName);
if(result != null){
req.setExclusiveStartKey(result.getLastEvaluatedKey());
}
result = client.scan(req);
totalItemCount += result.getItems().size();
} while(result.getLastEvaluatedKey() != null);
System.out.println("Result size: " + totalItemCount);
Ответ 10
Это решение для пользователей AWS JavaScript SDK, оно почти одинаково для других языков.
Result.data.Count даст вам то, что вы ищете
apigClient.getitemPost({}, body, {})
.then(function(result){
var dataoutput = result.data.Items[0];
console.log(result.data.Count);
}).catch( function(result){
});