2012-05-04 6 views
18

मेरे पास प्राथमिक कुंजी Id वाले उत्पादों नामक एक टेबल है। मैं टेबल में सभी वस्तुओं का चयन करना चाहता हूं। यह कोड है जिसका मैं उपयोग कर रहा हूं:मैं प्राथमिक कुंजी निर्दिष्ट किए बिना डायनामो डीबी तालिका से सभी आइटम कैसे प्राप्त कर सकता हूं?

$batch_get_response = $dynamodb->batch_get_item(array(
    'RequestItems' => array(

     'products' => array(
      'Keys' => array(
       array(// Key #1 
        'HashKeyElement' => array(AmazonDynamoDB::TYPE_NUMBER => '1'), 
        'RangeKeyElement' => array(AmazonDynamoDB::TYPE_NUMBER => $current_time), 
       ), 
       array(// Key #2 
        'HashKeyElement' => array(AmazonDynamoDB::TYPE_NUMBER => '2'), 
        'RangeKeyElement' => array(AmazonDynamoDB::TYPE_NUMBER => $current_time), 
       ), 
      ) 
     ) 
    ) 
)); 

क्या प्राथमिक कुंजी निर्दिष्ट किए बिना सभी आइटमों का चयन करना संभव है? मैं PHP के लिए एडब्ल्यूएस एसडीके का उपयोग कर रहा हूँ।

उत्तर

30

Amazon DynamoDB इस उद्देश्य के लिए Scan आपरेशन, प्रदान करता है जो रिटर्न एक या अधिक आइटम और एक मेज की एक पूरी स्कैन प्रदर्शन से उसके गुण। कृपया निम्न दो बाधाओं के बारे में पता होना:

नोट
तो कुल संख्या:

  • अपनी मेज आकार के आधार पर, आप पूरे परिणाम सेट पुनः प्राप्त करने के पृष्ठांकन उपयोग करना पड़ सकता स्कैन किए गए आइटमों की 1 एमबी सीमा से अधिक है, स्कैन स्टॉप और परिणाम LastEvaluatedK के साथ उपयोगकर्ता को बाद में ऑपरेशन में स्कैन जारी रखने के लिए वापस कर दिए जाते हैं। परिणामों में सीमा से अधिक वस्तुओं की संख्या भी शामिल है। एक स्कैन फ़िल्टर मानदंडों को पूरा करने वाला कोई तालिका डेटा नहीं हो सकता है।

    परिणाम सेट अंततः संगत है।

  • स्कैन आपरेशन संभावित दोनों प्रदर्शन और भस्म क्षमता इकाइयों (यानी कीमत) के बारे में महंगा है, खंड देखें स्कैन और Query and Scan in Amazon DynamoDB में जिज्ञासा प्रदर्शन:

    [...] इसके अलावा, जैसा एक टेबल बढ़ता है, स्कैन ऑपरेशन धीमा हो जाता है। स्कैन ऑपरेशन अनुरोधित मानों के लिए प्रत्येक आइटम की जांच करता है, और एक एकल ऑपरेशन में बड़ी तालिका के लिए प्रावधान थ्रूपुट का उपयोग कर सकता है। त्वरित प्रतिक्रिया समय के लिए, अपनी तालिकाओं को ऐसे तरीके से डिज़ाइन करें जो क्वेरी, गेट, या बैचगेटइटम एपीआई का उपयोग कर सकते हैं। या, अपने एप्लिकेशन को स्कैन ऑपरेशंस का उपयोग इस तरीके से करने के लिए करें कि आपकी तालिका की अनुरोध दर पर प्रभाव को कम करें। अधिक जानकारी के लिए, Provisioned Throughput Guidelines in Amazon DynamoDB देखें। [जोर मेरा]

  • आप और इस ऑपरेशन के बारे में अधिक जानकारी के Scanning Tables Using the AWS SDK for PHP Low-Level API for Amazon DynamoDB में मौजूद कुछ उदाहरण के टुकड़े पा सकते हैं, सबसे सरल उदाहरण के साथ illustrating आपरेशन किया जा रहा है:

    $dynamodb = new AmazonDynamoDB(); 
    
    $scan_response = $dynamodb->scan(array(
        'TableName' => 'ProductCatalog' 
    )); 
    
    foreach ($scan_response->body->Items as $item) 
    { 
        echo "<p><strong>Item Number:</strong>" 
         . (string) $item->Id->{AmazonDynamoDB::TYPE_NUMBER}; 
        echo "<br><strong>Item Name: </strong>" 
         . (string) $item->Title->{AmazonDynamoDB::TYPE_STRING} ."</p>"; 
    } 
    
    +0

    क्या क्वेरी में स्थिति जोड़ना संभव है? – Warrior

    +0

    हां, [स्कैन] के लिए _Request_ अनुभाग देखें (http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_Scan.html), 'स्कैनफ़िल्टर: तुलनाऑपरेटर' आप जो कर सकते हैं उसका एक सारांश प्रदान करता है।आपके परिदृश्य के आधार पर, आप [क्वेरी] (http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_Query.html) में भी देखना चाहते हैं, जो आमतौर पर प्रदर्शन और लागत के कारण दोनों के लिए बेहतर है (लेकिन एक प्राथमिक कुंजी की आवश्यकता है), जैसा कि [अमेज़ॅन डायनेमो डीबी में क्वेरी और स्कैन] में संबोधित किया गया है (http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/QueryAndScan.html)। –

    +0

    क्या आप मेरे नए प्रश्न पर देख सकते हैं? http://stackoverflow.com/questions/10477996/writing-complex-queries-in-amazone-dynamo-dbmathematical-expressions – Warrior

    0

    मैं सभी लाने निम्नलिखित क्वेरी के साथ डायनामोडब से आइटम। यह बढ़िया काम करता है। मैं ज़ेन फ्रेमवर्क में ये फ़ंक्शन जेनेरिक बनाता हूं और प्रोजेक्ट पर इन कार्यों तक पहुंचता हूं।

     public function getQuerydata($tablename, $filterKey, $filterValue){ 
          return $this->getQuerydataWithOp($tablename, $filterKey, $filterValue, 'EQ'); 
         } 
    
         public function getQuerydataWithOp($tablename, $filterKey, $filterValue, $compOperator){ 
         $result = $this->getClientdb()->query(array(
           'TableName'  => $tablename, 
           'IndexName'  => $filterKey, 
           'Select'  => 'ALL_ATTRIBUTES', 
           'KeyConditions' => array(
            $filterKey => array(
             'AttributeValueList' => array(
              array('S' => $filterValue) 
             ), 
           'ComparisonOperator' => $compOperator 
          ) 
          ) 
         )); 
          return $result['Items']; 
         } 
    
         //Below i Access these functions and get data. 
         $accountsimg = $this->getQuerydataWithPrimary('accounts', 'accountID',$msgdata[0]['accountID']['S']); 
    
    +0

    आपके डेटाबेस में कितने रिकॉर्ड हैं? 1 एमबी की सीमा है, ऐसा लगता है कि यह छोटे डेटाबेस के लिए बहुत अच्छा काम करेगा, लेकिन अगर आपके पास कुछ महत्वपूर्ण डेटा था तो सब कुछ नहीं मिलेगा। –

    +0

    आप सीमा पैरामीटर का उपयोग कर सकते हैं जो अमेज़ॅन डीबी प्रदान करते हैं जब आपको 1 एमबी से अधिक रिकॉर्ड प्राप्त होते हैं। –

    +0

    http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#FilteringResults से: "एक एकल क्वेरी या स्कैन ऑपरेशन अधिकतम 1 एमबी डेटा पुनर्प्राप्त कर सकता है। यह सीमा किसी भी फ़िल्टर अभिव्यक्ति से पहले लागू होती है परिणामों पर लागू होता है। " –

    संबंधित मुद्दे

     संबंधित मुद्दे