MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

स्प्रिंग डेटा MongoDB:अनुमान और एकत्रीकरण

1. अवलोकन

स्प्रिंग डेटा MongoDB, MongoDB मूल क्वेरी भाषा के लिए सरल उच्च-स्तरीय अमूर्तता प्रदान करता है। इस लेख में, हम अनुमानों और एकत्रीकरण ढांचे के लिए समर्थन का पता लगाएंगे।

यदि आप इस विषय पर नए हैं, तो हमारा परिचयात्मक लेख स्प्रिंग डेटा MongoDB का परिचय देखें।

2. प्रक्षेपण

MongoDB में, अनुमान एक डेटाबेस से दस्तावेज़ के केवल आवश्यक फ़ील्ड लाने का एक तरीका है। यह डेटा की मात्रा को कम करता है जिसे डेटाबेस सर्वर से क्लाइंट में स्थानांतरित किया जाना है और इसलिए प्रदर्शन बढ़ता है।

स्प्रिंग डेटा मोंगडीबी के साथ, अनुमानों का उपयोग MongoTemplate . दोनों के साथ किया जा सकता है और मोंगो रिपोजिटरी।

इससे पहले कि हम आगे बढ़ें, आइए उस डेटा मॉडल को देखें जिसका हम उपयोग करेंगे:

@Document
public class User {
    @Id
    private String id;
    private String name;
    private Integer age;
    
    // standard getters and setters
}

2.1. MongoTemplate . का उपयोग करके अनुमान

शामिल करें () और बहिष्कृत करें () फ़ील्ड . पर तरीके वर्ग का उपयोग क्रमशः फ़ील्ड को शामिल करने और बाहर करने के लिए किया जाता है:

Query query = new Query();
query.fields().include("name").exclude("id");
List<User> john = mongoTemplate.find(query, User.class);

कई क्षेत्रों को शामिल करने या बाहर करने के लिए इन विधियों को एक साथ जंजीर में बांधा जा सकता है। @Id . के रूप में चिह्नित फ़ील्ड (_id डेटाबेस में) हमेशा तब तक प्राप्त किया जाता है जब तक कि स्पष्ट रूप से बाहर नहीं किया जाता है।

बहिष्कृत फ़ील्ड शून्य हैं मॉडल क्लास इंस्टेंस में जब रिकॉर्ड प्रोजेक्शन के साथ लाए जाते हैं। ऐसे मामले में जहां फ़ील्ड एक आदिम प्रकार या उनके रैपर वर्ग के हैं, तो बहिष्कृत फ़ील्ड का मान आदिम प्रकार के डिफ़ॉल्ट मान हैं।

उदाहरण के लिए, स्ट्रिंग शून्य होगा , इंट /पूर्णांक होगा 0 और बूलियन /बूलियन झूठा होगा ।

इस प्रकार उपरोक्त उदाहरण में, नाम फ़ील्ड होगा जॉन , आईडी शून्य होगा और उम्र होगा 0.

2.2. MongoRepository . का उपयोग करके अनुमान

MongoRepositories का उपयोग करते समय, फ़ील्ड @क्वेरी . का एनोटेशन को JSON प्रारूप में परिभाषित किया जा सकता है:

@Query(value="{}", fields="{name : 1, _id : 0}")
List<User> findNameAndExcludeId();

परिणाम MongoTemplate का उपयोग करने जैसा ही होगा। मान=”{}” कोई फ़िल्टर नहीं दर्शाता है और इसलिए सभी दस्तावेज़ प्राप्त किए जाएंगे।

3. एकत्रीकरण

MongoDB में एकत्रीकरण डेटा को संसाधित करने और गणना किए गए परिणामों को वापस करने के लिए बनाया गया था। डेटा को चरणों में संसाधित किया जाता है और एक चरण के आउटपुट को अगले चरण में इनपुट के रूप में प्रदान किया जाता है। परिवर्तनों को लागू करने और चरणों में डेटा पर गणना करने की यह क्षमता एकत्रीकरण को विश्लेषण के लिए एक बहुत शक्तिशाली उपकरण बनाती है।

स्प्रिंग डेटा MongoDB तीन वर्गों एकत्रीकरण का उपयोग करके मूल एकत्रीकरण प्रश्नों के लिए एक अमूर्तता प्रदान करता है जो एक एग्रीगेशन क्वेरी को लपेटता है, एग्रीगेशनऑपरेशन जो अलग-अलग पाइपलाइन चरणों और एकत्रीकरण परिणाम . को लपेटता है जो एकत्रीकरण द्वारा उत्पादित परिणाम का कंटेनर है।

प्रदर्शन और एकत्रीकरण के लिए, सबसे पहले, एकत्रीकरण पर स्थिर बिल्डर विधियों का उपयोग करके एकत्रीकरण पाइपलाइन बनाएं वर्ग, फिर एकत्रीकरण . का एक उदाहरण बनाएं newAggregation() . का उपयोग करके एकत्रीकरण . पर विधि क्लास और अंत में MongoTemplate . का उपयोग करके एग्रीगेशन चलाएं :

MatchOperation matchStage = Aggregation.match(new Criteria("foo").is("bar"));
ProjectionOperation projectStage = Aggregation.project("foo", "bar.baz");
        
Aggregation aggregation 
  = Aggregation.newAggregation(matchStage, projectStage);

AggregationResults<OutType> output 
  = mongoTemplate.aggregate(aggregation, "foobar", OutType.class);

कृपया ध्यान दें कि दोनों MatchOperation और प्रोजेक्शनऑपरेशन एग्रीगेशन ऑपरेशन लागू करें . अन्य एकत्रीकरण पाइपलाइनों के लिए समान कार्यान्वयन हैं। आउटटाइप अपेक्षित आउटपुट के लिए डेटा मॉडल है।

अब, हम प्रमुख एकत्रीकरण पाइपलाइनों और ऑपरेटरों को कवर करने के लिए कुछ उदाहरणों और उनके स्पष्टीकरणों को देखेंगे।

इस आलेख में हम जिस डेटासेट का उपयोग करेंगे, वह यूएस में सभी ज़िप कोड के बारे में विवरण सूचीबद्ध करता है जिसे MongoDB रिपॉजिटरी से डाउनलोड किया जा सकता है।

आइए एक नमूना दस्तावेज़ को ज़िप . नामक संग्रह में आयात करने के बाद देखें परीक्षा . में डेटाबेस।

{
    "_id" : "01001",
    "city" : "AGAWAM",
    "loc" : [
        -72.622739,
        42.070206
    ],
    "pop" : 15338,
    "state" : "MA"
}

सरलता के लिए और कोड को संक्षिप्त बनाने के लिए, अगले कोड स्निपेट में, हम मान लेंगे कि सभी स्थिर एकत्रीकरण . के तरीके वर्ग स्थिर रूप से आयात किए जाते हैं।

3.1. 10 मिलियन से अधिक जनसंख्या वाले सभी राज्यों को जनसंख्या अवरोही क्रम में प्राप्त करें

यहां हमारे पास तीन पाइपलाइन होंगी:

  1. $समूह सभी ज़िप कोडों की जनसंख्या को संक्षेप में प्रस्तुत करने वाला चरण
  2. $मिलान 10 मिलियन से अधिक आबादी वाले राज्यों को फ़िल्टर करने का चरण
  3. $सॉर्ट करें जनसंख्या के अवरोही क्रम में सभी दस्तावेजों को छाँटने का चरण

अपेक्षित आउटपुट में एक फ़ील्ड होगा _id राज्य और क्षेत्र के रूप में statePop राज्य की कुल आबादी के साथ। आइए इसके लिए एक डेटा मॉडल बनाएं और एकत्रीकरण चलाएं:

public class StatePoulation {
 
    @Id
    private String state;
    private Integer statePop;
 
    // standard getters and setters
}

@Id एनोटेशन _id . को मैप करेगा आउटपुट से राज्य . तक फ़ील्ड मॉडल में:

GroupOperation groupByStateAndSumPop = group("state")
  .sum("pop").as("statePop");
MatchOperation filterStates = match(new Criteria("statePop").gt(10000000));
SortOperation sortByPopDesc = sort(Sort.by(Direction.DESC, "statePop"));

Aggregation aggregation = newAggregation(
  groupByStateAndSumPop, filterStates, sortByPopDesc);
AggregationResults<StatePopulation> result = mongoTemplate.aggregate(
  aggregation, "zips", StatePopulation.class);

एकत्रीकरण परिणाम क्लास इम्प्लीमेंट्स इटरेबल और इसलिए हम इस पर पुनरावृति कर सकते हैं और परिणाम प्रिंट कर सकते हैं।

यदि आउटपुट डेटा मॉडल ज्ञात नहीं है, तो मानक MongoDB वर्ग दस्तावेज़ इस्तेमाल किया जा सकता है।

3.2. शहर की औसत जनसंख्या के आधार पर सबसे छोटा राज्य प्राप्त करें

इस समस्या के लिए, हमें चार चरणों की आवश्यकता होगी:

  1. $समूह प्रत्येक शहर की कुल जनसंख्या का योग करने के लिए
  2. $समूह प्रत्येक राज्य की औसत जनसंख्या की गणना करने के लिए
  3. $सॉर्ट करें राज्यों को उनकी औसत शहर की आबादी के अनुसार आरोही क्रम में क्रमित करने का चरण
  4. $सीमा सबसे कम औसत शहर की आबादी वाला पहला राज्य पाने के लिए

हालांकि यह जरूरी नहीं है, हम एक अतिरिक्त $प्रोजेक्ट . का उपयोग करेंगे StatePopulation . के अनुसार दस्तावेज़ को पुन:स्वरूपित करने का चरण डेटा मॉडल।

GroupOperation sumTotalCityPop = group("state", "city")
  .sum("pop").as("cityPop");
GroupOperation averageStatePop = group("_id.state")
  .avg("cityPop").as("avgCityPop");
SortOperation sortByAvgPopAsc = sort(Sort.by(Direction.ASC, "avgCityPop"));
LimitOperation limitToOnlyFirstDoc = limit(1);
ProjectionOperation projectToMatchModel = project()
  .andExpression("_id").as("state")
  .andExpression("avgCityPop").as("statePop");

Aggregation aggregation = newAggregation(
  sumTotalCityPop, averageStatePop, sortByAvgPopAsc,
  limitToOnlyFirstDoc, projectToMatchModel);

AggregationResults<StatePopulation> result = mongoTemplate
  .aggregate(aggregation, "zips", StatePopulation.class);
StatePopulation smallestState = result.getUniqueMappedResult();

इस उदाहरण में, हम पहले से ही जानते हैं कि परिणाम में केवल एक दस्तावेज़ होगा क्योंकि हम अंतिम चरण में आउटपुट दस्तावेज़ों की संख्या को 1 तक सीमित करते हैं। इस प्रकार, हम getUniqueMappedResult() . का आह्वान कर सकते हैं आवश्यक राज्य जनसंख्या . प्राप्त करने के लिए उदाहरण।

ध्यान देने वाली एक और बात यह है कि, @Id . पर निर्भर रहने के बजाय मैप करने के लिए एनोटेशन _id कहने के लिए, हमने इसे प्रक्षेपण चरण में स्पष्ट रूप से किया है।

3.3. अधिकतम और न्यूनतम पिन कोड के साथ राज्य प्राप्त करें

इस उदाहरण के लिए, हमें तीन चरणों की आवश्यकता है:

  1. $समूह प्रत्येक राज्य के लिए ज़िप कोड की संख्या गिनने के लिए
  2. $सॉर्ट करें राज्यों को ज़िप कोड की संख्या के अनुसार आदेश देना
  3. $समूह $first . का उपयोग करके अधिकतम और न्यूनतम ज़िप कोड वाले राज्य का पता लगाने के लिए और अंतिम डॉलर ऑपरेटरों
GroupOperation sumZips = group("state").count().as("zipCount");
SortOperation sortByCount = sort(Direction.ASC, "zipCount");
GroupOperation groupFirstAndLast = group().first("_id").as("minZipState")
  .first("zipCount").as("minZipCount").last("_id").as("maxZipState")
  .last("zipCount").as("maxZipCount");

Aggregation aggregation = newAggregation(sumZips, sortByCount, groupFirstAndLast);

AggregationResults<Document> result = mongoTemplate
  .aggregate(aggregation, "zips", Document.class);
Document document= result.getUniqueMappedResult();

यहां हमने किसी मॉडल का उपयोग नहीं किया है बल्कि दस्तावेज़ . का उपयोग किया है पहले से ही MongoDB ड्राइवर प्रदान किया गया है।


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. मोंगो डीबी में सेव और इंसर्ट में क्या अंतर है?

  2. सी # के लिए सबसे परिपक्व मोंगोडीबी ड्राइवर क्या है?

  3. MongoDB में अनेक से अनेक संबंध कैसे व्यवस्थित करें?

  4. क्वेरी ऑपरेटर में MongoDB $

  5. MongoDB - दशमलव प्रकार के मूल्य के बारे में क्या?