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()
วิธีการดังกล่าวจะดึงเอกสารทุกรายการที่อยู่ในคอลเลกชันที่กำหนด
คุณยังสามารถจำกัดข้อมูลที่ดึงมาในปริมาณเฉพาะ ตามตัวอย่าง ให้พิจารณาคำแนะนำต่อไปนี้เพื่อรับเพียงสองเรกคอร์ดเริ่มต้น:
db.collection_name.find().limit(2)
กรองเอกสารในคอลเลกชัน
พิจารณาชุดข้อมูลเป็นภาพประกอบ ซึ่งมีวิธีการกรองหลายวิธีภายในขอบเขตของ MongoDB
ใช้วิธี"ค้นหา"เมื่อดึงข้อมูลจากฟิลด์เดียวภายในเอกสาร
db.collection_name.find({"Likes":"Wordle"}, {"_id":0, "Name":1})
ข้อความค้นหาดังกล่าวข้างต้นจะดึงเอกสารทั้งหมดที่มีคำว่า “ถูกใจ” ปรากฏขึ้น โดยไม่สนใจตัวระบุเอกสารเฉพาะและเน้นไปที่ชื่อเอกสารเท่านั้น
ในการดึงรายชื่อผู้ใช้ที่อายุเกิน 21 ปี อาจใช้ตัวดำเนินการมากกว่าที่แสดงเป็น “$gt”
db.collection_name.find({"Likes":"Chess", "Age":{"$gt":21}}, {"_id":0, "Name":1})
ผลลัพธ์มีลักษณะดังนี้:
เมื่อแทนที่"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]"}})
การแก้ไขดังกล่าวข้างต้นแก้ไขข้อความที่กำหนดในลักษณะที่แสดงด้านล่าง:
กระบวนการกำจัดฟิลด์อีเมลสามารถดำเนินการได้อย่างง่ายดายโดยใช้ตัวดำเนินการ $unset
ซึ่งทำหน้าที่เป็นเครื่องมือที่มีประสิทธิภาพในการลบองค์ประกอบที่ไม่ต้องการออกจากอาร์เรย์และวัตถุใน PHP อย่างมีประสิทธิภาพ การดำเนินการนี้เกี่ยวข้องกับการระบุองค์ประกอบที่ต้องการลบ ตามด้วยคีย์เวิร์ด $unset
ช่วยให้นักพัฒนาสามารถจัดการโครงสร้างข้อมูลได้อย่างมีประสิทธิภาพ ในขณะที่ยังคงความชัดเจนและความแม่นยำในโค้ดของตน
db.collection_name.updateOne({"Name":"Sandy"}, {"$unset":{"email":"[email protected]"}})
พิจารณาข้อมูลตัวอย่างต่อไปนี้:
หนึ่งอาจเพิ่มเนื้อหาขององค์ประกอบปัจจุบันภายในอาร์เรย์รายการโดยใช้ตัวดำเนินการ $push ซึ่งอนุญาตให้มีการแนะนำรายการใหม่ในการสะสมจุดข้อมูลนี้
db.collection_name.updateOne({"Name":"Pete"}, {"$push":{"items":"Plantain"}})
นี่คือผลลัพธ์:
ใช้โอเปอเรเตอร์ $each
เพื่อแทรกหลายองค์ประกอบพร้อมกัน:
db.collection_name.updateOne({"Name":"Pete"}, {"$push":{"items": {"$each":["Almond", "Melon"]}}})
นี่คือผลลัพธ์:
ตามที่ระบุไว้ก่อนหน้านี้ การใช้ตัวดำเนินการ $pull
ส่งผลให้เกิดการลบองค์ประกอบที่ระบุหรือคู่คีย์-ค่าภายในอาร์เรย์
db.collection_name.updateOne({"Name":"Pete"}, {"$pull":{"items":"Plantain"}})
ข้อมูลที่อัปเดตมีลักษณะดังนี้:
หากต้องการกำจัดหลายองค์ประกอบออกจากอาร์เรย์ที่กำหนดอย่างมีประสิทธิภาพ ให้ใช้ฟังก์ชัน “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 ในตัวโดยเฉพาะ
พิจารณาข้อมูลการขายต่อไปนี้ เช่น
กรอบการรวมของ MongoDB ช่วยให้สามารถคำนวณและรักษาตัวเลขยอดขายรวมสำหรับทุกการจัดประเภทผลิตภัณฑ์ได้โดยใช้ขั้นตอนต่อไปนี้:
db.sales.aggregate([{$group:{"_id":"$Section", "totalSold":{$sum:"$Sold"}}}, {$project:{"_id":0, "totalSold":1, "Section":"$_id"}}])
ข้อความค้นหาด้านบนส่งคืนสิ่งต่อไปนี้:
แบบสอบถาม MongoDB หลัก
MongoDB มีเทคนิคต่างๆ สำหรับการสืบค้นข้อมูล ซึ่งสามารถปรับปรุงประสิทธิภาพการสืบค้น โครงสร้างคิวรีพื้นฐานที่สรุปไว้ข้างต้นรองรับภาษาโปรแกรมต่างๆ และใช้เป็นจุดเริ่มต้นสำหรับการเข้าถึงฐานข้อมูล MongoDB
แม้จะมีความแตกต่างกันในไวยากรณ์พื้นฐาน แต่ภาษาโปรแกรมบางภาษายอมรับรูปแบบตัวพิมพ์ที่แตกต่างกัน ตามภาพประกอบ Python รองรับการจัดรูปแบบตัวพิมพ์งู ในขณะที่ JavaScript ใช้รูปแบบตัวพิมพ์อูฐ สิ่งสำคัญคือต้องตรวจสอบและทำความเข้าใจข้อกำหนดของแพลตฟอร์มเทคโนโลยีที่ต้องการก่อนที่จะใช้หลักการตั้งชื่อ