2014-12-05 124 views
21

我想知道使用DynamoDB查詢的項目數量。如何從DynamoDB獲取物品計數?

我可以查詢DynamoDB,但我只想知道'項目總數'。

例如,在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']); 

'SELECT COUNT(*)FROM ... WHERE ...' 這個代碼變得比我高點的所有用戶數據。

如果$ result的數量是100,000,$ result太大了。 它會超出查詢大小的限制。

我需要幫助。

回答

12

您可以在請求中使用Select parameter and use COUNT。它「返回匹配項目的數量,而不是匹配項目本身」。 重要,調出by Saumitra R. Bhave in a comment,「如果查詢結果集的大小大於1MB,則ScannedCount和Count將僅表示總項目的部分計數,您將需要按順序執行多個查詢操作檢索所有結果「

我並不熟悉PHP,但這裏是你如何使用它與Java。然後,而不是使用Count(我猜是在PHP函數)的'Items'可以使用Count value from the response - $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(); 

如果您不需要效仿WHERE條款,你可以使用DescribeTable請求和使用resulting item count to get an estimate.

指定表中的項目數。 DynamoDB大約每六小時更新一次該值。最近的更改可能不會反映在此值中。

+10

儘管如此,我認爲這裏有一個小問題,如http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Query.html#Query.Count所述,「如果查詢結果的大小設置大於1MB,則ScannedCount和Count將僅表示總項目的部分計數「,這基本上意味着項目首先被提取然後被計數,並且如果提取的項目的大小超過1MB,則'count'將是分頁 – 2017-04-16 06:22:52

+0

好趕上@ SaumitraR.Bhave,我會編輯答案。 – mkobit 2018-03-09 01:17:58

56

隨着aws dynamodb cli您可以按如下通過scan得到它:

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

響應將類似於此:

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

通知,此信息是在對比實時到describe-table api

+0

僅選擇計數是否消耗任何容量單位?響應包括「ConsumedCapacity:null」這種表示它是「免費」的? – JHH 2018-01-17 10:52:45

+0

@JHH我剛剛嘗試過,它看起來似乎使用讀取容量單位。根據DynamoDB控制檯,我的查詢消耗了大約12個單元(僅配置了1個);我假設它利用突發容量來服務查詢。 – Zodman 2018-01-23 06:34:30

+0

@Zodman謝謝你的嘗試!我再次閱讀文檔,實際上我發現了一個關於我之前錯過的計數的聲明:「計算項目的數量使用相同數量的讀取容量單位,並且需要進行相同的項目大小計算,因爲DynamoDB必須分別讀取項目以增加計數。「 https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/CapacityUnitCalculations.html#ItemSizeCalculations.Reads – JHH 2018-01-23 07:38:55

-2

這是AWS JavaScript SDK使用的解決方案rs,它與其他語言幾乎相同。

Result.data.Count會給你你在找什麼

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

    .then(function(result){ 

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

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

}); 
+1

請在答案中加上解釋。 – 2017-05-11 08:18:45

-1

我使用的掃描來獲得所需要的tableName.Following的總數爲同一

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); 
0
一個Java代碼片斷

也可以從UI中看到。 轉到表格上的概覽標籤,您會看到物品數量。希望它能幫助別人。

0

在PHP和Java類似只設置選擇參數設置的值 '計數'

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

和存取權限它就像這樣:

回聲$結果[ '伯爵'];

Saumitra上述小心結果集largers超過1 MB,在這種情況下使用LastEvaluatedKey直到它返回null得到最後更新的計數值。