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

MongoDB में दो संग्रह मर्ज करना

यह उस प्रश्न के समान है जो MongoDB-उपयोगकर्ता Google समूह पर पूछा गया था।
https://groups.google.com/group/mongodb-user/browse_thread/thread/60a8b683e2626ada?pli=1

उत्तर एक ऑनलाइन ट्यूटोरियल का संदर्भ देता है जो आपके उदाहरण के समान दिखता है:http://tebros.com/2011/07/using-mongodb-mapreduce-to-join-2-collections/

MongoDB में MapReduce के बारे में अधिक जानकारी के लिए, कृपया दस्तावेज़ देखें:http://www.mongodb.org/display/DOCS/MapReduce

इसके अतिरिक्त, एक उपयोगी चरण-दर-चरण पूर्वाभ्यास है कि कैसे एक MapReduce ऑपरेशन MongoDB कुकबुक लेख के "अतिरिक्त" खंड में काम करता है, जिसका शीर्षक है, "संस्करण वाले दस्तावेज़ों के साथ अधिकतम और न्यूनतम मान ढूँढना":http://cookbook.mongodb। संगठन/पैटर्न/finding_max_and_min/

मुझे क्षमा करें यदि आपने कुछ संदर्भित दस्तावेज़ पहले ही पढ़ लिए हैं। मैंने उन्हें अन्य उपयोगकर्ताओं के लाभ के लिए शामिल किया है जो इस पोस्ट को पढ़ रहे हैं और MongoDB में MapReduce का उपयोग करने के लिए नए हैं

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

मैंने दो अलग-अलग "वर्ग" सरणियों के साथ, आपके वांछित आउटपुट के प्रारूप में दस्तावेज़ों को उत्सर्जित करने के लिए आपके मानचित्र विवरण को थोड़ा संशोधित किया है। वे पहले से मौजूद नहीं हैं।

var mapDetails = function(){
    var output = {studentid: this.studentid, classes_1: [], classes_2: [], year: this.year, overall: 0, subscore: 0}
    if (this.year == 1) {
        output.classes_1 = this.classes;
    }
    if (this.year == 2) {
        output.classes_2 = this.classes;
    }
    emit(this.studentid, output);
};

var mapGpas = function() {
    emit(this.studentid, {studentid: this.studentid, classes_1: [], classes_2: [], year: 0, overall: this.overall, subscore: this.subscore});
};

var r = function(key, values) {
    var outs = { studentid: "0", classes_1: [], classes_2: [], overall: 0, subscore: 0};

    values.forEach(function(v){
        outs.studentid = v.studentid;
        v.classes_1.forEach(function(class){if(outs.classes_1.indexOf(class)==-1){outs.classes_1.push(class)}})
        v.classes_2.forEach(function(class){if(outs.classes_2.indexOf(class)==-1){outs.classes_2.push(class)}})

        if (v.year == 0) {
            outs.overall = v.overall;
            outs.subscore = v.subscore;
        }
    });
    return outs;
};

res = db.details.mapReduce(mapDetails, r, {out: {reduce: 'joined'}})
res = db.gpas.mapReduce(mapGpas, r, {out: {reduce: 'joined'}})

दो MapReduce संचालन चलाने से निम्नलिखित संग्रह प्राप्त होता है, जो आपके वांछित प्रारूप से मेल खाता है:

> db.joined.find()
{ "_id" : "12345a", "value" : { "studentid" : "12345a", "classes_1" : [ 1, 17, 19, 21 ], "classes_2" : [ 32, 91, 101, 217 ], "overall" : 97, "subscore" : 1 } }
{ "_id" : "24680a", "value" : { "studentid" : "24680a", "classes_1" : [ 1, 11, 18, 22 ], "classes_2" : [ ], "overall" : 76, "subscore" : 2 } }
{ "_id" : "98765a", "value" : { "studentid" : "98765a", "classes_1" : [ 2, 12, 19, 22 ], "classes_2" : [ 32, 99, 110, 215 ], "overall" : 85, "subscore" : 5 } }
>

MapReduce हमेशा दस्तावेज़ों को {_id:"id", value:"value"} के रूप में आउटपुट करता है। /www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29

यदि आप चाहते हैं कि MapReduce का आउटपुट एक अलग प्रारूप में दिखाई दे, तो आपको इसे अपने एप्लिकेशन में प्रोग्रामेटिक रूप से करना होगा।

उम्मीद है कि इससे MapReduce की आपकी समझ में सुधार होगा, और आपको अपना वांछित आउटपुट संग्रह तैयार करने के एक कदम और करीब ले जाएगा। शुभकामनाएँ!



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. mongo.so:> अपरिभाषित प्रतीक:php_json_encode अज्ञात में लाइन 0 पर। स्थापना के बाद php के लिए mongo ड्राइवर

  2. एक ही मोंगोडीबी अपडेट में $पुश और $सेट

  3. MongoDB $setIntersection

  4. नेस्टेड सरणियों का MongoDB प्रोजेक्शन

  5. स्वचालित डेटाबेस स्वास्थ्य जांच