Basit bir prosedür olduğunu düşündüğüm şeyi yapmak için MongoDB'de MapReduce kullanmaya çalışıyorum. Bu doğru bir yaklaşım olup olmadığını bilmiyorum, eğer MapReduce kullanıyor olsam bile. Hangi anahtar kelimeleri düşündüğümü araştırdım ve en çok başarıya ulaşacağımı düşündüğüm dokümanları vurmaya çalıştım - ama hiçbir şey. Belki bu konuda çok fazla düşünüyorum? details
ve gpas
MongoDB'de iki koleksiyon birleştirme
details
belgelerin sürü (3+ milyon) oluşur:
İki koleksiyonları var. studentid
öğe, aşağıdaki gibi, iki kez, her biri için bir tane year
tekrar edilebilir:
{ "_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
aynı studentid
's elemanları vardır. Böyle studentid
başına yalnızca bir giriş,:
{ "_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}
...
ben bu biçimde her öğrenci için bir satır ile bir koleksiyona sahip istiyorum Sonunda:
{ "_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}
...
yolu Bunu yapacaktım böyle mapreduce çalıştırarak oldu:
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'}})
Ama bunu çalıştırdığınızda, bu benim çıkan koleksiyon:
{ "_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 } }
Sınıf dizilerini kaçırıyorum.
Ayrıca bir kenara olarak, nasıl MapReduce value
elemanı çıkan öğeler erişebilirim? MapReduce her zaman value
'a mı yoksa adı neye verirseniz verilsin mi? yalnızca bir koleksiyonu uygulamak için tasarlanmıştır beri
Bu, çok yardımcı oldu. Bu yazıya verdiğiniz her zaman için minnettarım. Tekrar teşekkürler! – TFX
Benim için zevk! Yardım edebildiğim için mutluyum! Saygılarımla, Marc – Marc