DynamoDB से आइटम गणना कैसे प्राप्त करें?


84

मैं 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']);

इस कोड को सभी उपयोगकर्ताओं को मेरी बात से अधिक डेटा मिलता है।

यदि $ परिणाम की गिनती 100,000 है, तो $ परिणाम बहुत बड़ा है। और यह क्वेरी आकार की सीमा को पार कर जाएगा।

मुझे मदद की ज़रूरत है।

जवाबों:


29

आप अनुरोध में Selectपैरामीटर और उपयोगCOUNT कर सकते हैं । यह "मिलान वाली वस्तुओं की संख्या लौटाता है, न कि स्वयं मेल खाने वाली वस्तुओं की"। महत्वपूर्ण , जैसा कि सौमित्र आर। भावे द्वारा एक टिप्पणी में लाया गया है , "यदि क्वेरी परिणाम सेट का आकार 1 एमबी से बड़ा है, तो स्कैनकाउंट और काउंट कुल मदों की केवल एक आंशिक गणना का प्रतिनिधित्व करेंगे। आपको कई प्रदर्शन करने होंगे। सभी परिणामों को पुनः प्राप्त करने के लिए क्वेरी संचालन "

मैं PHP से परिचित नहीं हूँ लेकिन यहाँ आप जावा के साथ इसका उपयोग कैसे कर सकते हैं। और फिर उपयोग करने के बजाय Count(जो मैं अनुमान लगा रहा हूं कि PHP में एक फ़ंक्शन है) पर 'Items'आप Countप्रतिक्रिया से मूल्य का उपयोग कर सकते हैं $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अनुरोध का उपयोग कर सकते हैं और एक अनुमान प्राप्त करने के लिए परिणामी आइटम गणना का उपयोग कर सकते हैं

निर्दिष्ट तालिका में मदों की संख्या। DynamoDB इस मूल्य को लगभग हर छह घंटे में अपडेट करता है। हाल के परिवर्तन इस मूल्य में परिलक्षित नहीं हो सकते हैं।

इसके अलावा, इस उत्तर पर टिप्पणियों में सौमित्र आर। भावे द्वारा उल्लेखित दस्तावेज से एक महत्वपूर्ण नोट :

यदि Queryपरिणाम सेट का आकार 1 एमबी से बड़ा है, ScannedCountऔर Countकुल वस्तुओं का केवल एक आंशिक गिनती का प्रतिनिधित्व करता है। आपको Queryसभी परिणामों को पुनः प्राप्त करने के लिए कई ऑपरेशन करने की आवश्यकता है ( पेजिंग तालिका क्वेरी परिणाम देखें )।


17
मुझे लगता है कि हालांकि यहाँ docs.aws.amazon.com/amazondynamodb/latest/developerguide/… के अनुसार एक छोटी सी पकड़ है, जो कहती है "यदि क्वेरी परिणाम सेट का आकार 1 एमबी से बड़ा है, तो स्कैनकाउंट और काउंट प्रतिनिधित्व करेंगे कुल वस्तुओं की केवल एक आंशिक गिनती ", जिसका मूल अर्थ यह है कि आइटम पहले लाए जाते हैं और फिर गिने जाते हैं, और यदि प्राप्त वस्तुओं का आकार 1 एमबी से अधिक है, तो भी 'गणना' की गणना की जाएगी
सौमित्र आर। भावे

मैं @ mkobit के मूल काम को चोरी नहीं करना चाहता, लेकिन यह धाराप्रवाह चिनिंग का उपयोग करने का एक तरीका है:AmazonDynamoDBClientBuilder.standard().withRegion(region).withCredentials(credentialsProvider).build() .query(new QueryRequest(freeKeysTableName).withSelect(Select.COUNT)).getCount()
श्रीधर सरनोबत

2
बस अपना जवाब पूरा करने के लिए, जैसा कि आपको बताया गया है कि आपको कॉल को दोहराना पड़ सकता है जब तक कि LastEvalookKey परिणामों में मौजूद नहीं है और यह इस तरह दिख सकता है (ऊपर कोड के अंत में आता है): while(result.getLastEvaluatedKey()!=null){ request.setExclusiveStartKey(result.getLastEvaluatedKey()); result = dynamoDBClient.query(request); count+= result.getCount(); }
पीटर कोनज़

141

साथ एडब्ल्यूएस dynamodb CLI आप के माध्यम से इसे प्राप्त कर सकते हैं स्कैन इस प्रकार है:

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

प्रतिक्रिया इस तरह दिखाई देगी:

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

ध्यान दें कि यह जानकारी वर्णन-तालिका एपीआई के विपरीत वास्तविक समय में है


2
@ जेएचएच मैंने अभी इसकी कोशिश की है और यह रीड कैपेसिटी यूनिट्स का उपयोग करता हुआ दिखाई देता है। डायनॉम्बीडी कंसोल के अनुसार मेरी क्वेरी लगभग 12 इकाइयों (केवल 1 कॉन्फ़िगर है) का उपभोग करती है; मुझे लगता है कि यह क्वेरी की सेवा करने के लिए फट क्षमता का उपयोग कर रहा है।
राशि

2
@Zodman कोशिश करने के लिए धन्यवाद! मैं एक बार फिर डॉक्स के माध्यम से पढ़ता हूं और मुझे वास्तव में उन गणनाओं के बारे में एक बयान मिला है जो मैंने पहले याद किया था: "वस्तुओं की गिनती को पढ़ने की क्षमता इकाइयों की समान मात्रा का उपयोग करता है और समान आइटम आकार गणनाओं के अधीन है, क्योंकि डायनेमोबीडी को प्रत्येक को पढ़ना होगा गिनती बढ़ाने के लिए आइटम। " docs.aws.amazon.com/amazondynamodb/latest/developerguide/…
JHH

2
कोई सोच सकता है कि गिनती को कैच करना, कम से कम अंततः सुसंगत सीमाओं के भीतर, यह केवल एक ही सीयू का उपभोग करने के लिए संभव होगा, लेकिन हो सकता है कि केवल काउंट प्राप्त करना बहुत सामान्य परिदृश्य नहीं है।
JHH

2
@HelenNeely हाँ, यह तरीका नवीनतम आइटम गणना प्रदान करता है।
डेनियल बुबेनहेम

1
यह उत्तर सही नहीं है, कम से कम प्रश्न के संदर्भ में। सवाल यह है कि एक फिल्टर एक्सप्रेशन से मेल खाते रिकॉर्ड्स की गिनती कैसे की जाए, इसलिए WHERE स्टेटमेंट की तुलना कैसे की जाए। AFAIK महीनों के लिए यह पता लगाने की कोशिश कर रहा है कि आप मिलान रिकॉर्ड की गिनती प्राप्त नहीं कर सकते। डायनेमोडीबी तालिका या इंडेक्स में प्रत्येक रिकॉर्ड के माध्यम से जाएगा और फिल्टर से मेल खाने वालों को एक बार में 1000 रिकॉर्ड लौटाएगा। आपके पास केवल 20 मिलान रिकॉर्ड हो सकते हैं और गिनती के रूप में 20 प्राप्त करेंगे। हालांकि अगले 1000 रिकॉर्ड में 40 हो सकते हैं, और इसी तरह।
क्रिस लव

22

यूआई से भी देखा जा सकता है। टेबल पर अवलोकन टैब पर जाएं, आपको आइटम गणना दिखाई देगी। आशा है कि यह किसी की मदद करता है।


6
हां, लेकिन इसकी सीमाएं हैं: "भंडारण आकार और आइटम गणना वास्तविक समय में अपडेट नहीं की जाती हैं। वे हर छह घंटे में समय-समय पर अपडेट की जाती हैं।"
मथियास

इसके अलावा, यदि हम किसी क्वेरी की गिनती देखना चाहते हैं, तो यह ओवरव्यू टैब में नहीं किया जा सकता है। यह केवल तालिका में कुल पंक्तियों को दिखाता है, मेरी क्वेरी के परिणाम की गिनती को नहीं।
ज्योत्सना नंदवानी

7

अपने स्थानीय वातावरण पर डेटा प्राप्त करने के लिए तालिका नाम बदलें और नीचे क्वेरी का उपयोग करें:

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

तालिका का नाम बदलें और उत्पादन वातावरण पर डेटा प्राप्त करने के लिए समापन बिंदु url को हटा दें

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

6

यदि आप यहां तक ​​पहुंचने के लिए हैं, और आप C # के साथ काम कर रहे हैं, तो यहां कोड है:

var cancellationToken = new CancellationToken();

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

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

totalCount = result.Count;

यदि आपके पास 1MB से अधिक आइटम हैं, तो यह काम नहीं करता है।
जॉनऑपिनकर

1

PHP में जावा के समान ही 'PARUNT' मान के साथ चयन PARAMETER सेट करें

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

और यह इस तरह से होता है:

इको $ परिणाम ['काउंट'];

लेकिन जैसा कि ऊपर उल्लेखित सौमित्र 1 एमबी की तुलना में परिणामी लार्जर से सावधान रहता है, उस स्थिति में LastEvalookKey का उपयोग करें यह अंतिम अद्यतन गणना मान प्राप्त करने के लिए शून्य देता है।


0

आप डायनामोडब मैपर क्वेरी का उपयोग कर सकते हैं।

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

यह कॉल करता है loadAllResults()कि आलसी हो सकता है जब तक कि अगले उपलब्ध परिणाम लोड न हो जाए।

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


0
len(response['Items'])

आपको फ़िल्टर की गई पंक्तियों की गिनती देगा

कहाँ पे,

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

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

-1

स्काला में:

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

-2

मैंने आवश्यक तालिका का कुल काउंट प्राप्त करने के लिए स्कैन का उपयोग किया। नामकरण उसी के लिए एक जावा कोड स्निपेट है

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

-5

यह एडब्ल्यूएस जावास्क्रिप्ट एसडीके उपयोगकर्ताओं के लिए समाधान है, यह अन्य भाषाओं के लिए लगभग समान है।

Result.data.Count आपको वही देगा जो आप ढूंढ रहे हैं

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

    .then(function(result){

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

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

});

2
कृपया अपने उत्तर के साथ एक स्पष्टीकरण शामिल करें।
वंडरवर्कर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.