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

Fungsi MapReduce di MongoDB - Mengelompokkan dokumen berdasarkan ID

Dalam pembelajaran Anda, Anda mungkin melewatkan halaman manual inti di mapReduce . Ada satu bagian penting informasi yang Anda lewatkan atau belum baca dan pelajari:

Dan kemudian sedikit setelah itu:

Jadi yang pada dasarnya berarti bahwa karena "peredam" tidak benar-benar memproses "semua" kunci unik sekaligus, maka ia mengharapkan "input" yang sama dengan yang memberikan "output", karena output itu dapat diumpankan kembali ke peredam lagi.

Untuk alasan yang sama, "mapper" perlu mengeluarkan persis seperti yang diharapkan sebagai keluaran "peredam", yang juga merupakan "input" peredam. Jadi Anda sebenarnya tidak "mengubah" struktur data sama sekali, tetapi hanya "mengurangi" saja.

db.Cool.mapReduce(
    function(){emit(this.id, { "cools": [this.cool] })},
    function(key, values){
        var res = [];
        values.forEach(function(cool){
            cool.cools.forEach(function(v) {
                res.push(v);
            });
        });
        return {cools: res};
    },
    {out: "MapReduce"}     
)

Sekarang Anda menangani input sebagai array yang juga merupakan output, kemudian hasil yang diharapkan akan dikembalikan.

Hal berikutnya yang harus dipelajari adalah bahwa di sebagian besar case mapReduce sebenarnya bukan yang ingin Anda gunakan, dan Anda harus menggunakan kerangka agregasi sebagai gantinya.

Berbeda dengan mapReduce, ini menggunakan operator "kode asli" dan tidak memerlukan interpretasi JavaScript untuk dijalankan. Dan itu sebagian besar berarti "lebih cepat" dan seringkali jauh lebih sederhana dalam konstruksi.

Berikut adalah operasi yang sama dengan .aggregate() :

db.Cool.aggregate([
    { "$group": {
        "_id": "$id",
        "cools": { "$push": "$cool" }
    }}
])

Hal yang sama, lebih sedikit coding dan jauh lebih cepat.

Keluaran ke koleksi lain yang Anda gunakan $out :

db.Cool.aggregate([
    { "$group": {
        "_id": "$id",
        "cools": { "$push": "$cool" }
    }},
    { "$out": "reduced" }
])

Sebagai catatan, berikut adalah output mapReduce:

{ "_id" : "a", "value" : { "cools" : [ "a1", "a2" ] } }
{ "_id" : "b", "value" : { "cools" : [ "b1", "b2" ] } }
{ "_id" : "c", "value" : { "cools" : [ "c1" ] } }
{ "_id" : "d", "value" : { "cools" : [ "d1" ] } }

Dan output agregat. Dengan satu-satunya perbedaan dari mapReduce _id dan value keluaran madatory adalah bahwa kunci dibalik, karena $group tidak menjamin pesanan ( tetapi umumnya dianggap sebagai tumpukan terbalik ):

{ "_id" : "d", "cools" : [ "d1" ] }
{ "_id" : "c", "cools" : [ "c1" ] }
{ "_id" : "b", "cools" : [ "b1", "b2" ] }
{ "_id" : "a", "cools" : [ "a1", "a2" ] }


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Agregat Mongoose/Mongodb - grup dan rata-rata beberapa bidang

  2. Hanya ekspos bidang tertentu saat melihat item tertentu dengan Data Musim Semi?

  3. MongoDB:Server memiliki peringatan startup

  4. Pengindeksan pada bidang yang ada dalam larik subdokumen

  5. Menganalisis Kueri Lambat di MongoDB