में दो संग्रह विलय करना मैं मोंगो डीबी में मैपरेडस का उपयोग करने की कोशिश कर रहा हूं जो मुझे लगता है कि एक साधारण प्रक्रिया है। मुझे नहीं पता कि यह सही दृष्टिकोण है, अगर मुझे MapReduce का उपयोग करना चाहिए। मैंने जो खोजशब्दों के बारे में सोचा और उन दस्तावेज़ों को मारने की कोशिश की जहां मैंने सोचा कि मुझे सबसे ज्यादा सफलता मिलेगी - लेकिन कुछ भी नहीं। शायद मैं इस बारे में बहुत मुश्किल सोच रहा हूँ? details
और gpas
मोंगोडीबी
details
दस्तावेजों की एक पूरी गुच्छा (3+ मिलियन) से बना है:
मैं दो संग्रह है। studentid
तत्व दो बार, हर year
के लिए एक दोहराया जा सकता है, निम्नलिखित की तरह:
{ "_id" : ObjectId("4d49b7yah5b6d8372v640100"), "classes" : [1,17,19,21], "studentid" : "12345a", "year" : 1}
{ "_id" : ObjectId("4d76b7oij7s2d8372v640100"), "classes" : [2,12,19,22], "studentid" : "98765a", "year" : 1}
{ "_id" : ObjectId("4d49b7oij7s2d8372v640100"), "classes" : [32,91,101,217], "studentid" : "12345a", "year" : 2}
{ "_id" : ObjectId("4d76b7rty7s2d8372v640100"), "classes" : [1,11,18,22], "studentid" : "24680a", "year" : 1}
{ "_id" : ObjectId("4d49b7oij7s2d8856v640100"), "classes" : [32,99,110,215], "studentid" : "98765a", "year" : 2}
...
gpas
details
से एक ही studentid
के साथ तत्व है। studentid
में केवल एक प्रविष्टि, इस तरह:
{ "_id" : ObjectId("4d49b7yah5b6d8372v640111"), "studentid" : "12345a", "overall" : 97, "subscore": 1}
{ "_id" : ObjectId("4f76b7oij7s2d8372v640213"), "studentid" : "98765a", "overall" : 85, "subscore": 5}
{ "_id" : ObjectId("4j49b7oij7s2d8372v640871"), "studentid" : "24680a", "overall" : 76, "subscore": 2}
...
अंत मैं इस प्रारूप में प्रत्येक छात्र के लिए एक पंक्ति के साथ एक संग्रह है करना चाहते हैं:
{ "_id" : ObjectId("4d49b7yah5b6d8372v640111"), "studentid" : "12345a", "classes_1": [1,17,19,21], "classes_2": [32,91,101,217], "overall" : 97, "subscore": 1}
{ "_id" : ObjectId("4f76b7oij7s2d8372v640213"), "studentid" : "98765a", "classes_1": [2,12,19,22], "classes_2": [32,99,110,215], "overall" : 85, "subscore": 5}
{ "_id" : ObjectId("4j49b7oij7s2d8372v640871"), "studentid" : "24680a", "classes_1": [1,11,18,22], "classes_2": [], "overall" : 76, "subscore": 2}
...
तरह से मैं यह करने के लिए जा रहा था इस तरह MapReduce चलाकर था:
var mapDetails = function() {
emit(this.studentid, {studentid: this.studentid, classes: this.classes, year: this.year, overall: 0, subscore: 0});
};
var mapGpas = function() {
emit(this.studentid, {studentid: this.studentid, classes: [], year: 0, overall: this.overall, subscore: this.subscore});
};
var reduce = function(key, values) {
var outs = { studentid: "0", classes_1: [], classes_2: [], overall: 0, subscore: 0};
values.forEach(function(value) {
if (value.year == 0) {
outs.overall = value.overall;
outs.subscore = value.subscore;
}
else {
if (value.year == 1) {
outs.classes_1 = value.classes;
}
if (value.year == 2) {
outs.classes_2 = value.classes;
}
outs.studentid = value.studentid;
}
});
return outs;
};
res = db.details.mapReduce(mapDetails, reduce, {out: {reduce: 'joined'}})
res = db.gpas.mapReduce(mapGpas, reduce, {out: {reduce: 'joined'}})
लेकिन जब मैं इसे चलाने, यह मेरा है, जिसके परिणामस्वरूप संग्रह है:
{ "_id" : "12345a", "value" : { "studentid" : "12345a", "classes_1" : [ ], "classes_2" : [ ], "overall" : 97, "subscore" : 1 } }
{ "_id" : "98765a", "value" : { "studentid" : "98765a", "classes_1" : [ ], "classes_2" : [ ], "overall" : 85, "subscore" : 5 } }
{ "_id" : "24680a", "value" : { "studentid" : "24680a", "classes_1" : [ ], "classes_2" : [ ], "overall" : 76, "subscore" : 2 } }
मुझे कक्षाओं के सरणी गायब हैं।
इसके अलावा, एक तरफ के रूप में, मैं MapReduce value
तत्व के परिणामस्वरूप तत्वों का उपयोग कैसे करूं? क्या MapReduce हमेशा value
पर आउटपुट करता है या जो कुछ भी आप इसे नाम देते हैं?
इससे बहुत मदद मिली। मैं इस पोस्ट में हर बार सराहना करता हूं। एक बार फिर धन्यवाद! – TFX
मेरी खुशी! मुझे खुशी है कि मैं मदद करने में सक्षम था! ईमानदारी से, मार्क – Marc