Comment obtenir le nombre d'articles de DynamoDB?

je veux savoir le nombre d'items avec une interrogation DynamoDB.

je peux demander pour DynamoDB, mais je veux seulement savoir 'total count of item'.

par exemple, ' SELECT COUNT (*) FROM ... OÙ. .."in 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é que mon point.

si le compte de $ result est 100,000, $result est trop grand. Et il serait dépasser les limites de la taille de requête.

j'ai besoin d'aide.

33
demandé sur mkobit 2014-12-05 16:10:13

7 réponses

Vous pouvez utiliser le Select paramètre et utilisez COUNT dans la requête. Elle retourne le nombre d'éléments correspondants, plutôt que les éléments correspondants eux-mêmes". Important, comme l'a montré jusqu' par Saumitra R. Bhave dans un commentaire, " si la taille du jeu de résultats de la requête est supérieure à 1 MB, alors ScannedCount et Count ne représenteront qu'un compte partiel des éléments totaux. Vous aurez besoin d'effectuer des opérations de requête multiples afin de récupérer tous les résultats".

Je ne suis pas familier avec PHP Mais voici comment vous pouvez l'utiliser avec Java. Et puis au lieu d'utiliser Count (qui je suppose est une fonction en PHP) sur le 'Items' vous pouvez utiliser le Count valeur 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 l' WHERE l'article, vous pouvez utiliser un DescribeTable demander et utiliser le nombre d'articles résultants pour obtenir un estimer.

le nombre d'articles dans le tableau spécifié. DynamoDB met à jour cette valeur environ toutes les six heures. Les changements récents pourraient ne pas être reflétés dans cette valeur.

12
répondu mkobit 2018-03-09 01:28:17

aws dynamodb cli vous pouvez l'obtenir via scanner comme suit:

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

La réponse est similaire à ceci:

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

notez que cette information est en temps réel en contraste avec le décrivez-table api

77
répondu Daniel Bubenheim 2016-08-10 13:16:56

peut être vu à partir de L'UI aussi bien. Aller à l'onglet Aperçu sur la table, vous verrez le nombre d'articles. Espérons que cela aide quelqu'un.

3
répondu coder007 2018-01-05 23:58:24

similaire à Java en PHP seulement définir le paramètre Select 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 l'acces juste comme ça :

echo $result['Nombre'];

mais Saumitra mentionné ci-dessus soyez prudent avec les résultats dont la taille est supérieure à 1 MB, dans ce cas utilisez LastEvaluatedKey til il retourne null pour obtenir la dernière valeur de comptage mise à jour.

1
répondu jajhonrod 2018-03-07 17:57:29

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;
1
répondu ymerej 2018-03-12 17:54:23

j'ai utilisé scan pour obtenir le nombre total du nom de table requis.Voici un extrait de code Java pour le même

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);
-1
répondu user1977823 2017-08-02 07:16:19

c'est la solution pour les utilisateurs AWS JavaScript SDK, c'est presque la même chose pour les autres langues.

Résultat.données.Count vous donnera ce que vous cherchez

 apigClient.getitemPost({}, body, {})

    .then(function(result){

        var dataoutput = result.data.Items[0];

        console.log(result.data.Count);
  }).catch( function(result){

});
-2
répondu Mustafa Kahraman 2017-11-23 02:49:07