如何从DynamoDB获取项目数?

时间:2014-12-05 13:10:13

标签: database amazon-dynamodb

我想通过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太大了。 它会超出查询大小的限制。

我需要帮助。

13 个答案:

答案 0 :(得分:96)

使用aws dynamodb cli,您可以通过scan获取,如下所示:

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

响应看起来与此类似:

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

请注意,与describe-table api

相比,此信息是实时的

答案 1 :(得分:13)

您可以在请求中使用Select parameter and use COUNT。它“返回匹配项的数量,而不是匹配项本身”。 重要,提出by Saumitra R. Bhave in a comment“如果查询结果集的大小大于1 MB,则ScannedCount和Count将仅代表总项目的部分计数。您需要执行多个Query操作才能检索所有结果“

我不熟悉PHP,但是你可以在Java上使用它。然后在Count上使用'Items' - $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(); (我猜测它是PHP中的函数),而不是{/ 1}}:

WHERE

如果您不需要模拟{{1}}子句,则可以使用Count value from the response请求并使用DescribeTable

  

指定表格中的项目数。 DynamoDB大约每六个小时更新一次该值。最近的更改可能不会反映在此值中。

答案 2 :(得分:4)

也可以在UI上看到。 转到表格上的概览选项卡,您将看到项目计数。希望它可以帮到某人。

答案 3 :(得分:3)

如果您碰巧到达此处,并且您正在使用C#,则代码为:

var cancellationToken = new CancellationToken();

var request = new ScanRequest("TableName") {Select = Select.COUNT};

var result = context.Client.ScanAsync(request, cancellationToken).Result;

totalCount = result.Count;

答案 4 :(得分:2)

替换表名,并使用以下查询获取您本地环境中的数据:

aws dynamodb scan --table-name <TABLE_NAME> --select "COUNT" --endpoint-url http://localhost:8000

替换表名并删除端点url,以获取生产环境中的数据

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

答案 5 :(得分:2)

我来得太晚了,但我想扩展 Daniel 关于使用 aws cli 包含过滤器表达式的回答。

运行

aws dynamodb scan \
    --table-name <tableName> \
    --filter-expression "#v = :num" \
    --expression-attribute-names '{"#v": "fieldName"}' \
    --expression-attribute-values '{":num": {"N": "123"}}' \
    --select "COUNT"

愿意

{
    "Count": 2945,
    "ScannedCount": 7874,
    "ConsumedCapacity": null
}

也就是说,ScannedCount 是总计数,而 Count 是由给定表达式 (fieldName=123) 过滤的项目数。

答案 6 :(得分:1)

与PHP中的Java类似,只设置选择PARAMETER值&#39; COUNT&#39;

$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 [&#39; Count&#39;];

但是上面提到的 Saumitra 要小心大于1 MB的结果集,在这种情况下使用LastEvaluatedKey直到它返回null以获取最后更新的计数值。

答案 7 :(得分:0)

在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 :(得分:0)

您可以使用dynamodb映射器查询。

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

它调用loadAllResults(),这将延迟加载下一个可用结果,直到allResultsLoaded。

参考:https://docs.amazonaws.cn/en_us/amazondynamodb/latest/developerguide/DynamoDBMapper.Methods.html#DynamoDBMapper.Methods.query

答案 9 :(得分:0)

len(response['Items'])

将为您提供过滤后的行数

哪里

fe = Key('entity').eq('tesla')
response = table.scan(FilterExpression=fe)

答案 10 :(得分:0)

我将这个答案发布给所有使用C#的人,他们想要一个功能齐全,经过充分测试的答案,以演示使用查询而不是扫描。尤其是,此答案可以处理1MB以上的项目。

        public async Task<int> GetAvailableCount(string pool_type, string pool_key)
    {
        var queryRequest = new QueryRequest
        {
            TableName = PoolsDb.TableName,
            ConsistentRead = true,
            Select = Select.COUNT,
            KeyConditionExpression = "pool_type_plus_pool_key = :type_plus_key",
            ExpressionAttributeValues = new Dictionary<string, AttributeValue> {
                {":type_plus_key", new AttributeValue { S =  pool_type + pool_key }}
            },
        };
        var t0 = DateTime.UtcNow;
        var result = await Client.QueryAsync(queryRequest);
        var count = result.Count;
        var iter = 0;
        while ( result.LastEvaluatedKey != null && result.LastEvaluatedKey.Values.Count > 0) 
        {
            iter++;
            var lastkey = result.LastEvaluatedKey.Values.ToList()[0].S;
            _logger.LogDebug($"GetAvailableCount {pool_type}-{pool_key} iteration {iter} instance key {lastkey}");
            queryRequest.ExclusiveStartKey = result.LastEvaluatedKey;
            result = await Client.QueryAsync(queryRequest);
            count += result.Count;
        }
        _logger.LogDebug($"GetAvailableCount {pool_type}-{pool_key} returned {count} after {iter} iterations in {(DateTime.UtcNow - t0).TotalMilliseconds} ms.");
        return count;
    }
}

答案 11 :(得分:-1)

我使用scan来获取所需tableName的总数。以下是相同的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);

答案 12 :(得分:-2)

这是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){

});