MongoDB - แบบสอบถามที่ครอบคลุม
ในบทนี้เราจะเรียนรู้เกี่ยวกับแบบสอบถามที่ครอบคลุม
Covered Query คืออะไร?
ตามเอกสารอย่างเป็นทางการของ MongoDB แบบสอบถามที่ครอบคลุมคือแบบสอบถามที่ -
- ฟิลด์ทั้งหมดในแบบสอบถามเป็นส่วนหนึ่งของดัชนี
 - เขตข้อมูลทั้งหมดที่ส่งคืนในแบบสอบถามอยู่ในดัชนีเดียวกัน
 
เนื่องจากฟิลด์ทั้งหมดที่มีอยู่ในแบบสอบถามเป็นส่วนหนึ่งของดัชนี MongoDB จึงจับคู่เงื่อนไขการสืบค้นและส่งคืนผลลัพธ์โดยใช้ดัชนีเดียวกันโดยไม่ต้องเข้าไปดูในเอกสารจริงๆ เนื่องจากดัชนีมีอยู่ใน RAM การดึงข้อมูลจากดัชนีจึงเร็วกว่ามากเมื่อเทียบกับการดึงข้อมูลโดยการสแกนเอกสาร
การใช้แบบสอบถามที่ครอบคลุม
หากต้องการทดสอบคำค้นหาที่ครอบคลุมให้พิจารณาเอกสารต่อไปนี้ในไฟล์ users คอลเลกชัน -
{
   "_id": ObjectId("53402597d852426020000003"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "gender": "M",
   "name": "Tom Benzamin",
   "user_name": "tombenzamin"
} 
    ก่อนอื่นเราจะสร้างดัชนีสารประกอบสำหรับ users คอลเลกชันบนฟิลด์ gender และ user_name โดยใช้แบบสอบถามต่อไปนี้ -
>db.users.createIndex({gender:1,user_name:1})
{
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
} 
    ตอนนี้ดัชนีนี้จะครอบคลุมข้อความค้นหาต่อไปนี้ -
>db.users.find({gender:"M"},{user_name:1,_id:0})
{ "user_name" : "tombenzamin" } 
    กล่าวคือสำหรับข้อความค้นหาข้างต้น MongoDB จะไม่เข้าไปดูเอกสารฐานข้อมูล แต่จะดึงข้อมูลที่ต้องการจากข้อมูลที่จัดทำดัชนีซึ่งรวดเร็วมาก
เนื่องจากดัชนีของเราไม่รวม _idเราได้แยกมันออกจากชุดผลลัพธ์ของแบบสอบถามของเราอย่างชัดเจนเนื่องจาก MongoDB จะส่งคืนฟิลด์ _id โดยค่าเริ่มต้นในทุกแบบสอบถาม ดังนั้นแบบสอบถามต่อไปนี้จะไม่ถูกครอบคลุมในดัชนีที่สร้างขึ้นด้านบน -
>db.users.find({gender:"M"},{user_name:1})
{ "_id" : ObjectId("53402597d852426020000003"), "user_name" : "tombenzamin" } 
    สุดท้ายโปรดจำไว้ว่าดัชนีไม่สามารถครอบคลุมข้อความค้นหาได้ถ้า -
- ฟิลด์ใด ๆ ที่จัดทำดัชนีคืออาร์เรย์
 - ฟิลด์ใด ๆ ที่จัดทำดัชนีเป็นเอกสารย่อย