如何从 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 就太大了。 而且它将超过查询大小的限制。

我需要帮助。

201934 次浏览

您可以在请求中使用 参数并使用 COUNT。它“返回匹配项的数量,而不是匹配项本身”。Important调出 by Saumitra R. Bhave in a comment”如果 Query 结果集的大小大于1MB,那么 ScannedCount 和 Count 将仅表示总项的一部分计数。您需要执行多个 Query 操作来检索所有结果”

我对 PHP 不太熟悉,但下面介绍如何在 Java 中使用它。然后在 'Items'上使用 来自响应的 Count-$result['Count']代替 Count(我猜是 PHP 中的函数) :

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 大约每六小时更新一次这个值。最近的更改可能不会反映在此值中。

此外,正如 Saumitra R. Bhave在关于这一答复的评论中所指出的,documentation的一个重要说明是:

如果 Query结果集的大小大于1MB,则 ScannedCountCount仅表示总项的部分计数。您需要执行多个 Query操作来检索所有结果(参见 分页表查询结果)。

使用 Aws Dynamodb cli,你可以通过 scan获得如下信息:

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

反应将与此类似:

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

请注意,这些信息是实时的,与 描述表 API 形成对比

这是为 AWS JavaScript SDK 用户提供的解决方案,对于其他语言也是如此。

Data. Count 将为您提供所需的内容

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


.then(function(result){


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


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


});

我使用扫描来获得所需 tableName 的总计数

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);

也可以从 UI 中看到。 转到表格的概览标签,你会看到项目计数。希望对某些人有所帮助。

与 PHP 中的 Java 类似,只将 SelectPARAMETER 设置为值为‘ 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'
));

然后像这样进入:

回声 $result [‘ Count’] ;

but as 索米特拉 mentioned above be careful with resultsets largers than 1 MB, in that case use LastEvaluatedKey til it returns null to get the last updated count value.

如果您碰巧到达这里,并且正在使用 C # ,以下是代码:

var cancellationToken = new CancellationToken();


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


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


totalCount = result.Count;

在 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()

You could use dynamodb mapper query.

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

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

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

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

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

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

aws dynamodb scan --table-name <TABLE_NAME> --select "COUNT"
len(response['Items'])

将给出筛选行的计数

在哪里,

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

我把这个答案发布给任何使用 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;
}

}

我在这里太晚了,但想扩展丹尼尔的答案关于使用 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)筛选的项目数。

如果有人正在寻找一个直截了当的 NodeJS Lambda 计数解决方案:

const data = await dynamo.scan({ Select: "COUNT", TableName: "table" }).promise();


// data.Count -> number of elements in table.

DynamoDB 现在在 UI 中有一个‘ Get Live Item Count’按钮。如果您有一个大型表将消耗读取能力,请注意生产警告。

Live Item Count

Live Item Count

下面是使用 DynamoDBMapper(Kotlin 语法)实现的方法,这个例子完全没有过滤器:

dynamoDBMapper.count(MyEntity::class.java, DynamoDBScanExpression())