MongoDB - ลดแผนที่
ตามเอกสาร MongoDB Map-reduceเป็นกระบวนทัศน์การประมวลผลข้อมูลสำหรับการกลั่นข้อมูลจำนวนมากให้กลายเป็นผลลัพธ์รวมที่มีประโยชน์ MongoDB ใช้mapReduceคำสั่งสำหรับการดำเนินการลดแผนที่ โดยทั่วไป MapReduce จะใช้สำหรับการประมวลผลชุดข้อมูลขนาดใหญ่
คำสั่ง MapReduce
ต่อไปนี้เป็นไวยากรณ์ของคำสั่ง mapReduce พื้นฐาน -
>db.collection.mapReduce(
function() {emit(key,value);}, //map function
function(key,values) {return reduceFunction}, { //reduce function
out: collection,
query: document,
sort: document,
limit: number
}
)
ฟังก์ชันลดแผนที่จะค้นหาคอลเล็กชันก่อนจากนั้นแมปเอกสารผลลัพธ์เพื่อปล่อยคู่คีย์ - ค่าซึ่งจะลดลงตามคีย์ที่มีหลายค่า
ในไวยากรณ์ข้างต้น -
map เป็นฟังก์ชันจาวาสคริปต์ที่จับคู่ค่ากับคีย์และปล่อยคู่คีย์ - ค่า
reduce เป็นฟังก์ชันจาวาสคริปต์ที่ลดหรือจัดกลุ่มเอกสารทั้งหมดที่มีคีย์เดียวกัน
out ระบุตำแหน่งของผลลัพธ์แบบสอบถามลดแผนที่
query ระบุเกณฑ์การเลือกทางเลือกสำหรับการเลือกเอกสาร
sort ระบุเกณฑ์การจัดเรียงที่เป็นทางเลือก
limit ระบุจำนวนเอกสารสูงสุดที่เป็นทางเลือกที่จะส่งคืน
ใช้ MapReduce
พิจารณาโครงสร้างเอกสารต่อไปนี้ที่จัดเก็บโพสต์ของผู้ใช้ เอกสารจัดเก็บ user_name ของผู้ใช้และสถานะของโพสต์
{
"post_text": "tutorialspoint is an awesome website for tutorials",
"user_name": "mark",
"status":"active"
}
ตอนนี้เราจะใช้ฟังก์ชัน mapReduce บนไฟล์ posts คอลเลกชันเพื่อเลือกโพสต์ที่ใช้งานอยู่ทั้งหมดจัดกลุ่มตาม user_name จากนั้นนับจำนวนโพสต์โดยผู้ใช้แต่ละรายโดยใช้รหัสต่อไปนี้ -
>db.posts.mapReduce(
function() { emit(this.user_id,1); },
function(key, values) {return Array.sum(values)}, {
query:{status:"active"},
out:"post_total"
}
)
แบบสอบถาม mapReduce ด้านบนแสดงผลลัพธ์ต่อไปนี้ -
{
"result" : "post_total",
"timeMillis" : 9,
"counts" : {
"input" : 4,
"emit" : 4,
"reduce" : 2,
"output" : 2
},
"ok" : 1,
}
ผลลัพธ์แสดงให้เห็นว่าเอกสารทั้งหมด 4 รายการตรงกับข้อความค้นหา (สถานะ: "ใช้งานอยู่") ฟังก์ชันแผนที่แสดงเอกสาร 4 ชุดพร้อมคู่คีย์ - ค่าและสุดท้ายฟังก์ชันลดเอกสารที่จัดกลุ่มที่มีคีย์เดียวกันเป็น 2
หากต้องการดูผลลัพธ์ของแบบสอบถาม mapReduce นี้ให้ใช้ตัวดำเนินการค้นหา -
>db.posts.mapReduce(
function() { emit(this.user_id,1); },
function(key, values) {return Array.sum(values)}, {
query:{status:"active"},
out:"post_total"
}
).find()
แบบสอบถามข้างต้นให้ผลลัพธ์ต่อไปนี้ซึ่งบ่งชี้ว่าผู้ใช้ทั้งสอง tom และ mark มีสองโพสต์ในสถานะที่ใช้งานอยู่ -
{ "_id" : "tom", "value" : 2 }
{ "_id" : "mark", "value" : 2 }
ในลักษณะเดียวกันแบบสอบถาม MapReduce สามารถใช้เพื่อสร้างคิวรีการรวมที่ซับซ้อนขนาดใหญ่ การใช้ฟังก์ชัน Javascript ที่กำหนดเองใช้ประโยชน์จาก MapReduce ซึ่งมีความยืดหยุ่นและมีประสิทธิภาพมาก