Contents

11 แบบสอบถาม MongoDB และการดำเนินการที่คุณต้องรู้

MongoDB ได้รับความนิยมอย่างมากในหมู่นักพัฒนาเนื่องจากความสามารถที่โดดเด่น เช่น ความอเนกประสงค์ ความสามารถในการปรับขนาด และการจัดการข้อมูลจำนวนมหาศาลอย่างมีประสิทธิภาพ ในฐานะตัวเลือกที่เหมาะสำหรับแอพพลิเคชั่นซอฟต์แวร์ร่วมสมัย MongoDB มอบโอกาสให้ผู้ใช้เพิ่มพูนความชำนาญเกี่ยวกับการค้นหาที่เป็นมาตรฐานและขั้นตอนการปฏิบัติงาน

การมีความเข้าใจที่ซับซ้อนในการสอบถามและขั้นตอน MongoDB ที่แพร่หลาย ทำให้สามารถแยกและแก้ไขข้อมูลได้อย่างมีประสิทธิภาพ ในขณะที่สร้างโครงสร้างข้อมูลที่แข็งแกร่งและโปรแกรมที่ตอบสนองต่อผู้ใช้ ซึ่งจะเป็นการยกระดับความสามารถของพวกเขา

สร้างหรือสลับฐานข้อมูล

การสร้างฐานข้อมูลโลคัลโดยใช้เชลล์ MongoDB เป็นกระบวนการที่ไม่ซับซ้อน โดยเฉพาะอย่างยิ่งเมื่อมีการสร้างรีโมตคลัสเตอร์ หากต้องการสร้างฐานข้อมูลใหม่ภายใน MongoDB ให้ใช้คำสั่งต่อไปนี้:

 use db_name 

ในขณะที่ดำเนินการตามคำสั่งที่กล่าวถึงก่อนหน้านี้สร้างฐานข้อมูลใหม่ได้สำเร็จ มันยังอนุญาตให้ใช้เพื่อเปลี่ยนไปยังฐานข้อมูลที่มีอยู่แล้วโดยไม่ต้องดำเนินการกระบวนการสร้าง de novo

วางฐานข้อมูล

ในการเริ่มต้น ให้ใช้คำสั่ง use เช่นเดียวกับที่เราทำก่อนหน้านี้ เพื่อเชื่อมต่อกับฐานข้อมูลที่ต้องการซึ่งจำเป็นต้องทิ้ง จากนั้น ใช้ฟังก์ชัน dropDatabase() เพื่อลบฐานข้อมูลทั้งหมดออกจากระบบของคุณ

 use db_name
db.dropDatabase()

สร้างคอลเลกชัน

หากต้องการสร้างคอลเลกชันในฐานข้อมูลที่ต้องการ โปรดใช้เมธอด createCollection() ภายในสภาพแวดล้อม MongoDB ของคุณ:

 db.createCollection("collection_name")

แทนที่ collection_name ด้วยชื่อคอลเลกชั่นที่คุณเลือก

แทรกเอกสารลงในคอลเลกชัน

เมื่อส่งข้อมูลไปยังที่เก็บข้อมูล คุณสามารถส่งเรคคอร์ดเดี่ยวหรือเรคคอร์ดทั้งหมดได้

ในการแทรกเอกสารเดียว:

 db.collection_name.insertOne({"Name":"Idowu", "Likes":"Chess"})

เราสามารถใช้วิธีการดังกล่าวข้างต้นเพื่อรวมอาร์เรย์ของเอกสารที่มีตัวระบุเฉพาะตัวเดียว:

 db.collection_name.insertOne([{"Name":"Idowu", "Likes":"Chess"}, {"Language": "Mongo", "is_admin": true}])

หากต้องการเพิ่มเอกสารหลายรายการพร้อมตัวระบุที่ไม่ซ้ำกัน ให้ใช้วิธี “insertMany”:

 db.collection_name.insertMany([{"Name":"Idowu", "Likes":"Chess"}, {"Name": "Paul", "Likes": "Wordle"}])

รับเอกสารทั้งหมดจากคอลเลกชัน

ในการดึงเอกสารทั้งหมดภายในคอลเลกชันที่ระบุ อาจใช้เมธอด find() โดยใช้คีย์เวิร์ดของฐานข้อมูลที่เกี่ยวข้อง

 db.collection_name.find()

วิธีการดังกล่าวจะดึงเอกสารทุกรายการที่อยู่ในคอลเลกชันที่กำหนด

/th/images/query-result-sample-mongodb-find.jpg

คุณยังสามารถจำกัดข้อมูลที่ดึงมาในปริมาณเฉพาะ ตามตัวอย่าง ให้พิจารณาคำแนะนำต่อไปนี้เพื่อรับเพียงสองเรกคอร์ดเริ่มต้น:

 db.collection_name.find().limit(2)

กรองเอกสารในคอลเลกชัน

พิจารณาชุดข้อมูลเป็นภาพประกอบ ซึ่งมีวิธีการกรองหลายวิธีภายในขอบเขตของ MongoDB

/th/images/sample-data-for-filtering.jpg

ใช้วิธี"ค้นหา"เมื่อดึงข้อมูลจากฟิลด์เดียวภายในเอกสาร

 db.collection_name.find({"Likes":"Wordle"}, {"_id":0, "Name":1})

ข้อความค้นหาดังกล่าวข้างต้นจะดึงเอกสารทั้งหมดที่มีคำว่า “ถูกใจ” ​​ปรากฏขึ้น โดยไม่สนใจตัวระบุเอกสารเฉพาะและเน้นไปที่ชื่อเอกสารเท่านั้น

/th/images/filter-example-one.jpg

ในการดึงรายชื่อผู้ใช้ที่อายุเกิน 21 ปี อาจใช้ตัวดำเนินการมากกว่าที่แสดงเป็น “$gt”

 db.collection_name.find({"Likes":"Chess", "Age":{"$gt":21}}, {"_id":0, "Name":1})

ผลลัพธ์มีลักษณะดังนี้:

/th/images/filter-example-two.jpg

เมื่อแทนที่"find"ด้วย"findOne"ควรสังเกตการเปลี่ยนแปลงใดๆ ในฟังก์ชันการทำงานอย่างรอบคอบ ควรสังเกตว่ามีคำค้นหาการกรองเพิ่มเติมจำนวนมากอยู่ภายในระบบ

สัญลักษณ์ “$lt” แสดงถึงนิพจน์เชิงตรรกะที่ประเมินค่าเป็นจริงสำหรับค่าทั้งหมดที่น้อยกว่าค่าที่ระบุ ในขณะที่ค่าอื่นเป็นเท็จ

สัญลักษณ์ “$gte” แสดงถึงตัวดำเนินการเชิงตรรกะที่ใช้ในข้อความค้นหาและนิพจน์ ซึ่งระบุว่าค่าหนึ่งๆ ต้องเท่ากับหรือมากกว่าค่าที่ระบุ มันสามารถแสดงเป็น"มากกว่าหรือเท่ากับ"ในภาษาอังกฤษธรรมดา

สัญลักษณ์ “$lte” แสดงถึงนิพจน์เชิงตรรกะที่ประเมินว่าค่าที่กำหนดน้อยกว่าหรือเท่ากับค่าอื่นที่ระบุหรือไม่ ส่งผลให้เป็นจริงหากตรงตามเงื่อนไขและเป็นเท็จหากไม่เป็นเช่นนั้น

ฟังก์ชัน = ดึงข้อมูลองค์ประกอบทั้งหมดในชุดที่กำหนดซึ่งเท่ากับค่าที่ระบุ

ชุดขององค์ประกอบทั้งหมดที่ไม่มีค่าที่กำหนดจะแสดงเป็น"$ne"

สามารถใช้โอเปอเรเตอร์ “$in” ในการสืบค้นข้อมูลตามอาร์เรย์ โดยดึงองค์ประกอบทั้งหมดที่สอดคล้องกับรายการใดๆ ภายในอาร์เรย์ที่ระบุ ในทางกลับกัน ตัวดำเนินการ “$not in ($)” (หรือ “$nin”) จะใช้เพื่อแสดงผลลัพธ์สำหรับองค์ประกอบที่ไม่ตรงกับค่าใดๆ ภายในอาร์เรย์ที่ให้มา

เรียงลำดับแบบสอบถาม

การเรียงลำดับเป็นกระบวนการของการจัดเรียงข้อมูลในลำดับที่กำหนดไว้ล่วงหน้า ทั้งในลำดับจากมากไปน้อยหรือจากน้อยไปมาก ขึ้นอยู่กับเกณฑ์เฉพาะ สิ่งสำคัญคือต้องสังเกตว่าการเรียงลำดับจำเป็นต้องใช้การวัดเชิงปริมาณเพื่อการดำเนินการที่เหมาะสม

ตัวอย่างเช่น หากต้องการเรียงลำดับจากน้อยไปหามาก:

 db.collection_name.find({"Likes":"Chess"}).sort({"Age":1})

หากต้องการจัดเรียงคำถามข้างต้นตามลำดับจากมากไปน้อย ให้แทนที่"1"ด้วย"-1"

 db.collection_name.find({"Likes":"Chess"}).sort({"Age":-1})

อัปเดตเอกสาร

MongoDB ใช้ตัวดำเนินการปรมาณูร่วมกับการสืบค้นเพื่ออัปเดตเพื่อกำหนดผลลัพธ์ที่ต้องการของการแก้ไขข้อมูล ด้านล่างนี้ เราได้รวบรวมตัวดำเนินการปรมาณูที่ใช้บ่อยเพื่อจุดประสงค์นี้:

อันที่จริง ดูเหมือนว่ามีความไม่สอดคล้องกันบางประการในคำศัพท์ระหว่างข้อความสองส่วนที่คุณให้ไว้ ในส่วนแรก คำว่า"ชุด"ใช้เพื่ออ้างถึงการจัดกลุ่มของฟิลด์ในแบบฟอร์ม ในขณะที่ในส่วนที่สอง คำว่า"ชุดฟิลด์"ใช้เพื่อระบุชุดของฟิลด์ที่มีจุดประสงค์ร่วมกันโดยเฉพาะ การกำหนดมาตรฐานของภาษาที่ใช้ในทั้งสองส่วนอาจเป็นประโยชน์เพื่อความชัดเจนและสอดคล้องกัน

คำสั่ง $push ใช้เพื่อเพิ่มองค์ประกอบใหม่ให้กับอาร์เรย์ และสามารถจับคู่กับตัวดำเนินการ $each สำหรับการแทรกหลายองค์ประกอบพร้อมกัน

ฟังก์ชัน $pull เป็นคำสั่งที่ลบองค์ประกอบออกจากอาร์เรย์ตามค่าคีย์ที่ระบุ สามารถใช้ร่วมกับโอเปอเรเตอร์ $in เพื่อลบหลายรายการพร้อมกันได้อย่างมีประสิทธิภาพ โดยระบุอาร์เรย์ของค่าสำหรับพารามิเตอร์ values ​​

คำสั่ง $unset ใน MongoDB ใช้เพื่อลบฟิลด์เฉพาะออกจากเอกสารที่มีอยู่ การดำเนินการนี้สามารถดำเนินการกับคอลเล็กชันใดก็ได้ และจะอัปเดตเอกสารทั้งหมดภายในคอลเล็กชันนั้นโดยลบฟิลด์ที่ระบุออก ไวยากรณ์สำหรับการใช้วิธี ` unset’เกี่ยวข้องกับการระบุชื่อของฟิลด์ที่คุณต้องการยกเลิกการตั้งค่า รวมถึงตัวเลือกสำหรับการแก้ไขข้อความค้นหาหากจำเป็น

หากต้องการแก้ไขเอกสารที่มีอยู่ในขณะที่รวมองค์ประกอบใหม่ไว้ด้วย ให้พิจารณาขั้นตอนต่อไปนี้:1. เข้าถึงเอกสารที่คุณต้องการแก้ไขและเปลี่ยนแปลงเนื้อหาหรือรูปแบบที่ต้องการ ซึ่งอาจเกี่ยวข้องกับการแก้ไขข้อผิดพลาด อัปเดตข้อมูลที่ล้าสมัย หรือเพิ่มรายละเอียดใหม่2. กำหนดการเปลี่ยนแปลงเฉพาะที่จำเป็นตามเป้าหมายและวัตถุประสงค์ของคุณ ตัวอย่างเช่น หากคุณต้องการรวมฟิลด์ข้อมูลเพิ่มเติมในเอกสาร ให้ตัดสินใจว่าฟิลด์เหล่านี้ควรมีข้อมูลประเภทใดและจะจัดระเบียบข้อมูลเหล่านี้อย่างไรภายในโครงสร้างโดยรวมของเอกสาร3. ใช้การเปลี่ยนแปลงโดยทำการแก้ไขที่เหมาะสมกับเอกสารโดยตรง ขึ้นอยู่กับลักษณะของการอัปเดต ซึ่งอาจเกี่ยวข้องกับการแก้ไขข้อความ ปรับรูปแบบ หรือเพิ่มส่วนใหม่4. ตรวจสอบเอกสารที่แก้ไขอย่างละเอียดเพื่อให้แน่ใจว่า

 db.collection_name.updateOne({"Name":"Sandy"}, {"$set":{"Name":"James", "email":"[email protected]"}})

การแก้ไขดังกล่าวข้างต้นแก้ไขข้อความที่กำหนดในลักษณะที่แสดงด้านล่าง:

/th/images/sample-update-query.jpg

กระบวนการกำจัดฟิลด์อีเมลสามารถดำเนินการได้อย่างง่ายดายโดยใช้ตัวดำเนินการ $unset ซึ่งทำหน้าที่เป็นเครื่องมือที่มีประสิทธิภาพในการลบองค์ประกอบที่ไม่ต้องการออกจากอาร์เรย์และวัตถุใน PHP อย่างมีประสิทธิภาพ การดำเนินการนี้เกี่ยวข้องกับการระบุองค์ประกอบที่ต้องการลบ ตามด้วยคีย์เวิร์ด $unset ช่วยให้นักพัฒนาสามารถจัดการโครงสร้างข้อมูลได้อย่างมีประสิทธิภาพ ในขณะที่ยังคงความชัดเจนและความแม่นยำในโค้ดของตน

 db.collection_name.updateOne({"Name":"Sandy"}, {"$unset":{"email":"[email protected]"}})

พิจารณาข้อมูลตัวอย่างต่อไปนี้:

/th/images/sample-data-for-update-example.jpg

หนึ่งอาจเพิ่มเนื้อหาขององค์ประกอบปัจจุบันภายในอาร์เรย์รายการโดยใช้ตัวดำเนินการ $push ซึ่งอนุญาตให้มีการแนะนำรายการใหม่ในการสะสมจุดข้อมูลนี้

 db.collection_name.updateOne({"Name":"Pete"}, {"$push":{"items":"Plantain"}})

นี่คือผลลัพธ์:

/th/images/update-query-result-sample.jpg

ใช้โอเปอเรเตอร์ $each เพื่อแทรกหลายองค์ประกอบพร้อมกัน:

 db.collection_name.updateOne({"Name":"Pete"}, {"$push":{"items": {"$each":["Almond", "Melon"]}}})

นี่คือผลลัพธ์:

/th/images/updated-data-multiple-updates.jpg

ตามที่ระบุไว้ก่อนหน้านี้ การใช้ตัวดำเนินการ $pull ส่งผลให้เกิดการลบองค์ประกอบที่ระบุหรือคู่คีย์-ค่าภายในอาร์เรย์

 db.collection_name.updateOne({"Name":"Pete"}, {"$pull":{"items":"Plantain"}})

ข้อมูลที่อัปเดตมีลักษณะดังนี้:

/th/images/removed-data-sample.jpg

หากต้องการกำจัดหลายองค์ประกอบออกจากอาร์เรย์ที่กำหนดอย่างมีประสิทธิภาพ ให้ใช้ฟังก์ชัน “include\_array” และส่งไปยังอาร์เรย์ที่ต้องการพร้อมกับคีย์เฉพาะหรือช่วงดัชนีที่คุณต้องการแยกออก เมื่อใช้ฟังก์ชัน “include\_array” กับตัวดำเนินการ “$in” คุณสามารถกรององค์ประกอบที่ไม่ต้องการจำนวนมากพร้อมกันได้อย่างมีประสิทธิภาพ โดยไม่ต้องลบออกทีละรายการ

 db.collection_name.updateOne({"Name":"Pete"}, {"$pull":{"items": {"$in":["Almond", "Melon"]} }}) 

ลบเอกสารหรือฟิลด์

คำหลัก"deleteOne"หรือ"deleteMany"ใช้เพื่อกำจัดเอกสารออกจากคอลเลกชันฐานข้อมูล เมื่อใช้คำสั่งเหล่านี้ สิ่งสำคัญคือต้องระบุฟิลด์เฉพาะที่จะใช้การลบ สิ่งนี้ทำให้สามารถลบเรคคอร์ดเฉพาะที่เป็นเป้าหมายได้ในขณะที่รักษาเรคคอร์ดอื่นที่อาจมีค่าแตกต่างกันสำหรับฟิลด์ที่กำหนด

 db.collection_name.deleteOne({"Name":"IDNoble"})

หากต้องการลบเอกสารจำนวนมากที่ใช้คีย์เดียวกันร่วมกันอย่างมีประสิทธิภาพ ขอแนะนำให้ใช้เมธอด “deleteMany” แทนการพยายามดำเนินการค้นหาที่ให้มา ข้อความค้นหานี้จะลบรายการทั้งหมดภายในฐานข้อมูลที่มีเนื้อหา"หมากรุก"เป็นหนึ่งในค่ากำหนด

 db.collection.deleteMany({"Likes":"Chess"})

การดำเนินการจัดทำดัชนี

การทำดัชนีเป็นเทคนิคที่ช่วยเพิ่มประสิทธิภาพของการสืบค้นฐานข้อมูลโดยลดปริมาณข้อมูลที่ต้องตรวจสอบ การเพิ่มประสิทธิภาพนี้สามารถทำได้โดยการสร้างดัชนีในฟิลด์ที่ใช้บ่อยภายในฐานข้อมูล ซึ่งนำไปสู่การปรับปรุงประสิทธิภาพคิวรีในท้ายที่สุด

ในทำนองเดียวกัน MongoDB ใช้เทคนิคการทำดัชนีที่สะท้อนเทคนิคที่ใช้ในการปรับการสืบค้น SQL ให้เหมาะสมผ่านการใช้ดัชนีในฟิลด์เฉพาะ เพื่อเป็นภาพประกอบ ให้ลองสร้างดัชนีจากน้อยไปมากในฟิลด์"ชื่อ"

 db.collection.createIndex({"Name":1})

ในการแสดงรายการดัชนีของคุณ:

 db.collection.getIndexes()

นอกเหนือจากวิธีการที่กล่าวถึงก่อนหน้านี้แล้ว ยังมีวิธีการทางเลือกอีกมากมายสำหรับการสร้างดัชนีภายในบริบทของระบบฐานข้อมูล MongoDB

รวมพล

Aggregation Pipeline ซึ่งเป็นการทำซ้ำของ MapReduce ที่ปรับปรุงแล้ว ช่วยอำนวยความสะดวกในการเรียกใช้และการรักษาการคำนวณที่ซับซ้อนภายในขอบเขตของ MongoDB ตรงกันข้ามกับ MapReduce ซึ่งจำเป็นต้องสร้างฟังก์ชัน JavaScript แยกต่างหากสำหรับกระบวนการแมปและการลดขนาด Aggregation นำเสนอประสบการณ์ที่ราบรื่นโดยใช้ประโยชน์จากขั้นตอน MongoDB ในตัวโดยเฉพาะ

พิจารณาข้อมูลการขายต่อไปนี้ เช่น

/th/images/sales-sample-data-from-mongodb-1.jpg

กรอบการรวมของ MongoDB ช่วยให้สามารถคำนวณและรักษาตัวเลขยอดขายรวมสำหรับทุกการจัดประเภทผลิตภัณฑ์ได้โดยใช้ขั้นตอนต่อไปนี้:

 db.sales.aggregate([{$group:{"_id":"$Section", "totalSold":{$sum:"$Sold"}}}, {$project:{"_id":0, "totalSold":1, "Section":"$_id"}}])

ข้อความค้นหาด้านบนส่งคืนสิ่งต่อไปนี้:

/th/images/aggregate-result-sample-1.jpg

แบบสอบถาม MongoDB หลัก

MongoDB มีเทคนิคต่างๆ สำหรับการสืบค้นข้อมูล ซึ่งสามารถปรับปรุงประสิทธิภาพการสืบค้น โครงสร้างคิวรีพื้นฐานที่สรุปไว้ข้างต้นรองรับภาษาโปรแกรมต่างๆ และใช้เป็นจุดเริ่มต้นสำหรับการเข้าถึงฐานข้อมูล MongoDB

แม้จะมีความแตกต่างกันในไวยากรณ์พื้นฐาน แต่ภาษาโปรแกรมบางภาษายอมรับรูปแบบตัวพิมพ์ที่แตกต่างกัน ตามภาพประกอบ Python รองรับการจัดรูปแบบตัวพิมพ์งู ในขณะที่ JavaScript ใช้รูปแบบตัวพิมพ์อูฐ สิ่งสำคัญคือต้องตรวจสอบและทำความเข้าใจข้อกำหนดของแพลตฟอร์มเทคโนโลยีที่ต้องการก่อนที่จะใช้หลักการตั้งชื่อ