web-dev-qa-db-fra.com

Comment obtenir le nombre d'articles de DynamoDB?

Je souhaite connaître le nombre d'éléments avec l'interrogation DynamoDB.

Je peux interroger DynamoDB, mais je veux seulement savoir le "nombre total d'éléments".

Par exemple, 'SELECT COUNT (*) FROM ... WHERE ...' dans 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']);

ce code obtient les données de tous les utilisateurs plus élevés que mon point.

Si le résultat de $ résultat est 100 000, le résultat de $ est trop grand. Et cela dépasserait les limites de la taille de la requête.

J'ai besoin d'aide.

51
sam lee

Vous pouvez utiliser le paramètre Select et utiliser COUNT dans la demande. Il "renvoie le nombre d'éléments correspondants, plutôt que les éléments correspondants eux-mêmes". Important , tel qu'évoqué par Saumitra R. Bhave dans un commentaire , "If la taille du jeu de résultats de la requête est supérieure à 1 Mo, puis ScannedCount et Count ne représentent qu'un compte partiel du nombre total d'éléments. Vous devrez effectuer plusieurs opérations de requête pour pouvoir récupérer tous les résultats " .

Je ne connais pas PHP mais voici comment vous pouvez l'utiliser avec Java. Et puis, au lieu d'utiliser Count (dont je devine qu'il est une fonction en PHP), le 'Items' vous pouvez utiliser la valeur Count de la réponse - $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();

Si vous n'avez pas besoin d'émuler la clause WHERE, vous pouvez utiliser une requête DescribeTable et utiliser la requête Le nombre d'articles résultant pour obtenir une estimation.

Le nombre d'éléments dans la table spécifiée. DynamoDB met à jour cette valeur toutes les six heures environ. Les modifications récentes peuvent ne pas être reflétées dans cette valeur.

15
mkobit

Avec le aws dynamodb cli vous pouvez l’obtenir via scan comme suit:

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

La réponse ressemblera à ceci:

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

remarquez que cette information est en temps réel contrairement à la describe-table api

106
Daniel Bubenheim

Peut être vu de l'interface utilisateur aussi bien. Allez à la vue d'ensemble sur la table, vous verrez le nombre d'articles. J'espère que ça aide quelqu'un.

5
coder007

S'il vous arrive d'arriver ici et que vous travaillez avec C #, voici le code:

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

Similaire à Java in PHP ne définit que Select PARAMETER avec la valeur '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'
));

et y accéder comme ça:

echo $ result ['Count'];

mais comme Saumitra mentionné ci-dessus, faites attention aux résultats supérieurs à 1 Mo. Dans ce cas, utilisez LastEvaluatedKey jusqu'à ce qu'il renvoie la valeur null pour obtenir la dernière valeur de compte mise à jour.

1
jajhonrod

En 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()
0

Vous pouvez utiliser la requête dynamodb mapper.

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

il appelle loadAllResults() qui chargerait paresseusement le prochain résultat disponible jusqu'à ce que allResultsLoaded.

Réf.: https://docs.amazonaws.cn/en_us/amazondynamodb/latest/developerguu/DynamoDBMapper.Methods.html#DynamoDBMapper.Methods.query

0
Feng Han