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 ซึ่งมีความยืดหยุ่นและมีประสิทธิภาพมาก