Подтвердить что ты не робот

Как получить количество предметов из 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, результат $слишком большой. И это превысит пределы размера запроса.

Мне нужна помощь.

4b9b3361

Ответ 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){

});