我想通过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太大了。 它会超出查询大小的限制。
我需要帮助。
答案 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。
答案 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){
});