MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Menggabungkan dua koleksi di MongoDB

Ini mirip dengan pertanyaan yang diajukan di Grup Google pengguna MongoDB.
https://groups.google.com/group/mongodb-user/browse_thread/thread/60a8b683e2626ada?pli=1

Jawabannya merujuk pada tutorial online yang terlihat mirip dengan contoh Anda:http://tebros.com/2011/07/using-mongodb-mapreduce-to-join-2-collections/

Untuk informasi lebih lanjut tentang MapReduce di MongoDB, silakan lihat dokumentasi:http://www.mongodb.org/display/DOCS/MapReduce

Selain itu, ada panduan langkah demi langkah yang berguna tentang cara kerja operasi MapReduce di Bagian "Ekstra" dari artikel Buku Masak MongoDB berjudul, "Menemukan Nilai Maks Dan Min dengan Dokumen Berversi":http://cookbook.mongodb. org/patterns/finding_max_and_min/

Maafkan saya jika Anda telah membaca beberapa dokumen yang dirujuk. Saya telah memasukkannya untuk kepentingan pengguna lain yang mungkin membaca posting ini dan baru menggunakan MapReduce di MongoDB

Penting bahwa output dari pernyataan 'emit' dalam fungsi Peta cocok dengan output dari fungsi Reduce. Jika hanya ada satu keluaran dokumen dengan fungsi Peta, fungsi Kurangi mungkin tidak dijalankan sama sekali, dan koleksi keluaran Anda akan memiliki dokumen yang tidak cocok.

Saya telah sedikit memodifikasi pernyataan peta Anda untuk memancarkan dokumen dalam format keluaran yang Anda inginkan, dengan dua larik "kelas" terpisah.
Saya juga telah mengerjakan ulang pernyataan pengurangan Anda untuk menambahkan kelas baru ke larik kelas_1 dan kelas_2, hanya jika mereka belum ada.

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'}})

Menjalankan dua operasi MapReduce menghasilkan kumpulan berikut, yang cocok dengan format yang Anda inginkan:

> 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 selalu mengeluarkan dokumen dalam bentuk {_id:"id", value:"value"}Ada lebih banyak informasi yang tersedia tentang bekerja dengan sub-dokumen dalam dokumen berjudul, "Notasi Titik (Mencapai Objek)":http:/ /www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29

Jika Anda ingin output MapReduce muncul dalam format yang berbeda, Anda harus melakukannya secara terprogram di aplikasi Anda.

Semoga ini akan meningkatkan pemahaman Anda tentang MapReduce, dan membuat Anda selangkah lebih dekat untuk menghasilkan koleksi keluaran yang Anda inginkan. Semoga Sukses!



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana cara mewakili bidang MongoDB GeoJSON dalam Skema Mongoose?

  2. Menyimpan struct bersarang dengan mgo

  3. NodeJS dan MongoDB FindAndModify() perlu dihapus atau diperbarui

  4. Memfilter dokumen yang disematkan di MongoDB

  5. Bagaimana cara kerja contoh penghitungan pesan di Meteor docs?