Pengurangan Peta MongoDB
Map-Reduce ialah model pengkomputeran Ringkasnya, ia menguraikan sekumpulan besar kerja (data) untuk pelaksanaan (MAP), dan kemudian menggabungkan hasilnya ke dalam hasil akhir (REDUCE).
Map-Reduce yang disediakan oleh MongoDB adalah sangat fleksibel dan agak praktikal untuk analisis data berskala besar.
Arahan MapReduce
Berikut ialah sintaks asas MapReduce:
>db.collection.mapReduce( function() {emit(key,value);}, //map 函数 function(key,values) {return reduceFunction}, //reduce 函数 { out: collection, query: document, sort: document, limit: number } )
Menggunakan MapReduce untuk melaksanakan dua fungsi fungsi Map dan Mengurangkan fungsi, Fungsi peta memancarkan panggilan (kunci, nilai), Lintas semua rekod dalam koleksi dan hantar kunci dan nilai kepada fungsi Kurangkan untuk diproses.
Fungsi Peta mesti memanggil emit(kunci, nilai) untuk mengembalikan pasangan nilai kunci.
Perihalan parameter:
peta: fungsi pemetaan (menjana jujukan pasangan nilai kunci sebagai parameter fungsi kurangkan).
mengurangkan Fungsi statistik, tugas fungsi mengurangkan adalah untuk menukar nilai kunci kepada nilai kunci, iaitu mengubah nilai tatasusunan menjadi satu nilai nilai. .
keluar Koleksi storan hasil statistik (jika tidak dinyatakan, koleksi sementara akan digunakan, yang akan dipadamkan secara automatik selepas pelanggan diputuskan sambungan).
pertanyaan Syarat penapis Hanya dokumen yang memenuhi syarat akan memanggil fungsi peta. (query.limit, isihan boleh digabungkan sesuka hati)
isih Parameter isihan isihan digabungkan dengan had (juga mengisih dokumen sebelum dihantar ke fungsi peta) , anda boleh Optimumkan mekanisme pengumpulan
had Had atas bilangan dokumen yang dihantar ke fungsi peta (jika tiada had, menggunakan isihan sahaja ialah penggunaan sedikit)
Gunakan MapReduce
Pertimbangkan struktur dokumen berikut untuk menyimpan artikel pengguna Dokumen ini menyimpan nama_pengguna dan medan status artikel:
>db.posts.insert({ "post_text": "php中文网,最全的技术文档。", "user_name": "mark", "status":"active" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "php中文网,最全的技术文档。", "user_name": "mark", "status":"active" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "php中文网,最全的技术文档。", "user_name": "mark", "status":"active" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "php中文网,最全的技术文档。", "user_name": "mark", "status":"active" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "php中文网,最全的技术文档。", "user_name": "mark", "status":"disabled" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "php中文网,最全的技术文档。", "user_name": "php", "status":"disabled" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "php中文网,最全的技术文档。", "user_name": "php", "status":"disabled" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "php中文网,最全的技术文档。", "user_name": "php", "status":"active" }) WriteResult({ "nInserted" : 1 })
Sekarang, kami akan Gunakan fungsi mapReduce dalam koleksi siaran untuk memilih artikel yang diterbitkan (status: "aktif"), kumpulkan mengikut nama_pengguna dan mengira bilangan artikel untuk setiap pengguna:
>db.posts.mapReduce( function() { emit(this.user_name,1); }, function(key, values) {return Array.sum(values)}, { query:{status:"active"}, out:"post_total" } )
Hasil keluaran mapReduce di atas ialah:
{ "result" : "post_total", "timeMillis" : 23, "counts" : { "input" : 5, "emit" : 5, "reduce" : 1, "output" : 2 }, "ok" : 1 }
Keputusan menunjukkan terdapat 4 dokumen yang memenuhi syarat pertanyaan (status: "aktif"). Empat dokumen pasangan nilai kunci dijana dalam fungsi peta, dan akhirnya fungsi pengurangan digunakan untuk membahagikan nilai kunci yang sama kepada dua kumpulan.
Perihalan parameter khusus:
hasil: nama koleksi yang menyimpan hasilnya. Ini adalah koleksi sementara sambungan MapReduce ditutup Ia akan dipadamkan secara automatik.
timeMillis: masa yang diambil untuk melaksanakan, dalam milisaat
input: bilangan dokumen yang memenuhi syarat dan dihantar ke fungsi peta
memancarkan: bilangan kali memancar dipanggil dalam fungsi peta, iaitu jumlah jumlah data dalam semua koleksi
ouput: bilangan dokumen dalam koleksi hasil Kiraan (kiraan sangat membantu untuk penyahpepijatan)
ok: sama ada berjaya, kejayaan adalah 1
-
err: Jika gagal, mungkin ada sebab untuk kegagalan itu, tetapi dari pengalaman, alasannya kabur dan tidak berguna
Gunakan operator cari untuk melihat petaKurangkan hasil pertanyaan:
>db.posts.mapReduce( function() { emit(this.user_name,1); }, function(key, values) {return Array.sum(values)}, { query:{status:"active"}, out:"post_total" } ).find()
Pertanyaan di atas memaparkan hasil berikut Dua pengguna tom dan mark mempunyai dua artikel yang diterbitkan:
{ "_id" : "mark", "value" : 4 } { "_id" : "php", "value" : 1 }
Dengan cara yang sama, MapReduce boleh digunakan untuk membina pertanyaan pengagregatan yang besar dan kompleks.
Fungsi Peta dan fungsi Reduce boleh dilaksanakan menggunakan JavaScript, menjadikan penggunaan MapReduce sangat fleksibel dan berkuasa.