10

एपीआई दस्तावेज़ों से डायनेमो डीबी स्कैन और क्वेरी ऑपरेशंस के लिए पेजिनेशन का समर्थन करता है। यहां का पकड़ ExclusiveStartIndex को वर्तमान अनुरोध के LastEvaluatedIndex के मूल्य के अगले सेट (तार्किक पृष्ठ) प्राप्त करने के लिए वर्तमान अनुरोध के सेट को सेट करना है।डायनेमो डीबीएम्पर जावा एडब्ल्यूएस एसडीके

मैं इसे लागू करने की कोशिश कर रहा हूं लेकिन मैं DynamoDBMapper का उपयोग कर रहा हूं, जिसमें डेटा मॉडल के साथ तंग युग्मन जैसे बहुत अधिक फायदे हैं। तो अगर मैं ऊपर करना चाहता था, मुझे लगता है मैं नीचे की तरह कुछ करना होगा संभालने हूँ:

// Mapping of hashkey of the last item in previous query operation 
Map<String, AttributeValue> lastHashKey = .. 
DynamoDBQueryExpression expression = new DynamoDBQueryExpression(); 

... 
expression.setExclusiveStartKey(); 
List<Table> nextPageResults = mapper.query(Table.class, expression); 

मुझे आशा है कि मेरे ऊपर समझ DynamoDBMapper का उपयोग कर paginating पर सही है। दूसरा, मुझे कैसे पता चलेगा कि मैं परिणामों के अंत तक पहुंच गया हूं।

QueryResult result = dynamoDBClient.query((QueryRequest) request); 
boolean isEndOfResults = StringUtils.isEmpty(result.getLastEvaluatedKey()); 

DynamoDBMapper उपयोग करने के लिए वापस आ रहा है, मैं कैसे पता कर सकते हैं अगर मैं इस मामले में परिणाम के अंत तक पहुंच: डॉक्स से अगर मैं निम्नलिखित एपीआई का उपयोग करें।

उत्तर

22

आपके पास DynamoDBMapper के साथ कुछ अलग-अलग विकल्प हैं, इस पर निर्भर करते हुए कि आप किस तरह से जाना चाहते हैं।

हिस्सा रिटर्न के बीच अंतर को समझने है विधियों, और उनकी लौटाई गई वस्तुओं की कार्यक्षमता क्या है संपुटित।

मैं PaginatedScanList और ScanResultPage पर जाउंगा, लेकिन ये विधियां/ऑब्जेक्ट मूल रूप से एक-दूसरे को दर्पण करते हैं।

सूची इंटरफेस कि एडब्ल्यूएस DynamoDB में एक स्कैन से परिणाम का प्रतिनिधित्व करता है के कार्यान्वयन:

PaginatedScanList निम्नलिखित, जोर मेरा कहते हैं। पृष्ठ पर अंकुरित परिणाम मांग पर लोड होते हैं जब उपयोगकर्ता एक ऑपरेशन निष्पादित करता है जिसके लिए उन्हें आवश्यकता होती है। कुछ ऑपरेशन, जैसे कि आकार(), को पूरी सूची लेनी होगी, लेकिन जब संभव हो तो पृष्ठ पृष्ठ पर आलसी पृष्ठ प्राप्त होते हैं।

यह कहता है कि परिणाम सूची के माध्यम से लोड होने पर परिणाम लोड होते हैं। जब आप पहले पृष्ठ से गुज़रते हैं, तो दूसरे पृष्ठ को स्वचालित रूप से बाहर निकाला जाता है जिसे आप स्पष्ट रूप से एक और अनुरोध करना चाहते हैं। परिणामों को आलसी लोड करना डिफ़ॉल्ट तरीका है, लेकिन अगर आप ओवरलोडेड विधियों को कॉल करते हैं और को एक अलग DynamoDBMapperConfig.PaginationLoadingStrategy के साथ आपूर्ति करते हैं तो इसे ओवरराइड किया जा सकता है।

यह ScanResultPage से अलग है। आपको परिणामों का एक पृष्ठ दिया जाता है, और यह खुद को पेजिनेशन से निपटने के लिए तैयार है।

final DynamoDBMapper mapper = new DynamoDBMapper(client); 

// Using 'PaginatedScanList' 
final DynamoDBScanExpression paginatedScanListExpression = new DynamoDBScanExpression() 
     .withLimit(limit); 
final PaginatedScanList<MyClass> paginatedList = mapper.scan(MyClass.class, paginatedScanListExpression); 
paginatedList.forEach(System.out::println); 

System.out.println(); 
// using 'ScanResultPage' 
final DynamoDBScanExpression scanPageExpression = new DynamoDBScanExpression() 
     .withLimit(limit); 
do { 
    ScanResultPage<MyClass> scanPage = mapper.scanPage(MyClass.class, scanPageExpression); 
    scanPage.getResults().forEach(System.out::println); 
    System.out.println("LastEvaluatedKey=" + scanPage.getLastEvaluatedKey()); 
    scanPageExpression.setExclusiveStartKey(scanPage.getLastEvaluatedKey()); 

} while (scanPageExpression.getExclusiveStartKey() != null); 

और उत्पादन:

MyClass{hash=2} 
MyClass{hash=1} 
MyClass{hash=3} 
MyClass{hash=0} 
MyClass{hash=4} 

MyClass{hash=2} 
MyClass{hash=1} 
LastEvaluatedKey={hash={N: 1,}} 
MyClass{hash=3} 
MyClass{hash=0} 
LastEvaluatedKey={hash={N: 0,}} 
MyClass{hash=4} 
LastEvaluatedKey=null 
+0

तो 'limit' है

यहाँ त्वरित कोड DynamoDBLocal का उपयोग कर दोनों तरीकों कि मैं 5 मदों की एक मेज के साथ भाग गया का एक उदाहरण उपयोग दिखा नमूना है 'क्वेरी' का उपयोग करते समय 2 कहने के लिए सेट करें, यह अभी भी सभी रिकॉर्ड्स लौट रहा है। ऐसा क्यों है? – user7

+1

@ उपयोगकर्ता 7 यह केवल ऐसा प्रतीत होता है कि यह सभी रिकॉर्ड्स लौटा रहा है, वास्तव में अंतर्निहित कार्यान्वयन ('पेजिनेटेडक्विलिस्ट ') आपके लिए पेजिनेशन को संभालने में कामयाब रहा है। ['PaginatedQueryList'] के लिए प्रलेखन देखें (https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/PaginatedQueryList.html)। यह वैसे ही व्यवहार करता है जैसा मैंने उपरोक्त 'स्कैन' के बारे में पोस्ट किया था। असल में, यदि आप इसे फिर से चालू करते हैं, तो अंततः यह सभी तत्वों को प्राप्त करेगा क्योंकि यह स्वचालित रूप से पेजिनेशन कॉल कर रहा है। – mkobit

+0

तो 'withLimit' इसके लिए आवेदन नहीं करता है? – user7

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