การแปลบทความจัดทำขึ้นในวันเริ่มต้นหลักสูตร
ไฮไลท์:
- การพัฒนาสคีมาเป็นสิ่งสำคัญอย่างยิ่งแม้ว่าจะเป็นทางเลือกใน MongoDB ก็ตาม
- ในทำนองเดียวกัน ดัชนีจะต้องตรงกับสคีมาและรูปแบบการเข้าถึงของคุณ
- หลีกเลี่ยงการใช้วัตถุขนาดใหญ่และอาร์เรย์ขนาดใหญ่
- ระมัดระวังกับการตั้งค่า MongoDB โดยเฉพาะอย่างยิ่งในเรื่องความปลอดภัยและความน่าเชื่อถือ
- MongoDB ไม่มีเครื่องมือเพิ่มประสิทธิภาพคิวรี ดังนั้นคุณต้องระมัดระวังเมื่อดำเนินการคิวรี
ฉันทำงานกับฐานข้อมูลมาเป็นเวลานาน แต่เพิ่งค้นพบ MongoDB เท่านั้น มีบางสิ่งที่ฉันอยากรู้ก่อนที่จะเริ่มทำงาน เมื่อบุคคลมีประสบการณ์ในสาขาใดสาขาหนึ่งแล้ว พวกเขาจะมีความคิดอุปาทานว่าฐานข้อมูลคืออะไรและทำอะไร ด้วยความหวังที่จะทำให้ผู้อื่นเข้าใจได้ง่ายขึ้น ฉันจึงนำเสนอรายการข้อผิดพลาดทั่วไป
การสร้างเซิร์ฟเวอร์ MongoDB โดยไม่มีการตรวจสอบสิทธิ์
น่าเสียดายที่ MongoDB ได้รับการติดตั้งโดยไม่มีการรับรองความถูกต้องตามค่าเริ่มต้น สำหรับเวิร์กสเตชันที่เข้าถึงได้ภายในเครื่อง การปฏิบัตินี้ถือเป็นเรื่องปกติ แต่เนื่องจาก MongoDB เป็นระบบที่มีผู้ใช้หลายคนซึ่งชอบใช้หน่วยความจำจำนวนมาก มันจะดีกว่าถ้าคุณวางไว้บนเซิร์ฟเวอร์ที่มี RAM มากที่สุดเท่าที่จะเป็นไปได้ แม้ว่าคุณจะใช้มันเพื่อการพัฒนาเท่านั้นก็ตาม การติดตั้งบนเซิร์ฟเวอร์ผ่านพอร์ตเริ่มต้นอาจเป็นปัญหาได้ โดยเฉพาะอย่างยิ่งหากสามารถดำเนินการโค้ด Javascript ใดๆ ในคำขอได้ (เช่น $where
เพื่อเป็นไอเดียสำหรับ
มีวิธีการรับรองความถูกต้องหลายวิธี แต่วิธีที่ง่ายที่สุดคือการตั้งค่า ID ผู้ใช้/รหัสผ่าน ใช้แนวคิดนี้ในขณะที่คุณนึกถึงการรับรองความถูกต้องแบบแฟนซี
อย่าลืมผูกพื้นผิวการโจมตีของคุณกับ MongoDB
,
หรือ
. เนื่องจากไฟล์ข้อมูลไม่ได้เข้ารหัสใน MongoDB มาตรฐาน จึงเหมาะสมที่จะเรียกใช้ MongoDB ด้วย
เกิดข้อผิดพลาดขณะพัฒนาวงจร
MongoDB ไม่ได้ใช้สคีมา แต่ไม่ได้หมายความว่าไม่จำเป็นต้องใช้โครงการนี้ หากคุณเพียงต้องการจัดเก็บเอกสารโดยไม่มีรูปแบบที่สอดคล้องกัน การจัดเก็บเอกสารเหล่านั้นอาจทำได้ง่ายและรวดเร็ว แต่การเรียกคืนในภายหลังอาจเป็นเรื่องยาก
บทความคลาสสิก "
อย่าลืมลำดับการจัดเรียง
การลืมลำดับการจัดเรียงอาจทำให้เกิดความยุ่งยากและเสียเวลามากกว่าการกำหนดค่าที่ไม่ถูกต้องอื่นๆ ตามค่าเริ่มต้น MongoBD จะใช้
สร้างคอลเลกชันด้วยเอกสารขนาดใหญ่
MongoDB มีความยินดีที่จะโฮสต์เอกสารขนาดใหญ่ถึง 16MB ในคอลเลกชันและ
การสร้างเอกสารด้วยอาร์เรย์ขนาดใหญ่
เอกสารสามารถมีอาร์เรย์ได้ จะเป็นการดีที่สุดหากจำนวนองค์ประกอบในอาร์เรย์อยู่ห่างจากตัวเลขสี่หลัก หากมีการเพิ่มองค์ประกอบลงในอาร์เรย์บ่อยครั้ง องค์ประกอบนั้นจะเติบโตเร็วกว่าเอกสารที่มีองค์ประกอบนั้นและจะต้องเพิ่มองค์ประกอบนั้นด้วย
MongoDB มีสิ่งที่เรียกว่า
คุณอาจคิดว่าคุณสามารถทำได้โดยไม่ต้องสร้างดัชนีอาร์เรย์ น่าเสียดายที่การขาดดัชนีอาจทำให้คุณประสบปัญหาอื่นๆ เนื่องจากเอกสารถูกสแกนตั้งแต่ต้นจนจบ การค้นหาองค์ประกอบที่ส่วนท้ายของอาร์เรย์จึงใช้เวลานานกว่า และการดำเนินการส่วนใหญ่ที่เกี่ยวข้องกับเอกสารดังกล่าวจะเป็น
อย่าลืมว่าลำดับขั้นในการรวมมีความสำคัญ
ในระบบฐานข้อมูลที่มีเครื่องมือเพิ่มประสิทธิภาพคิวรี คิวรีที่คุณเขียนคือคำอธิบายถึงสิ่งที่คุณต้องการรับ ไม่ใช่วิธีการรับ กลไกนี้ทำงานโดยการเปรียบเทียบกับการสั่งอาหารในร้านอาหาร โดยปกติแล้วคุณเพียงแค่สั่งอาหาร และไม่ให้คำแนะนำโดยละเอียดแก่พ่อครัว
ใน MongoDB คุณสั่งแม่ครัว ตัวอย่างเช่น คุณต้องแน่ใจว่าข้อมูลผ่านไปได้ reduce
เร็วที่สุดเท่าที่จะทำได้ในไปป์ไลน์โดยใช้ $match
и $project
และการเรียงลำดับจะเกิดขึ้นหลังจากนั้นเท่านั้น reduce
และการค้นหาจะเกิดขึ้นตามลำดับที่คุณต้องการ การมีเครื่องมือเพิ่มประสิทธิภาพคิวรีที่ขจัดงานที่ไม่จำเป็น จัดลำดับขั้นตอนอย่างเหมาะสม และเลือกประเภทการรวมอาจทำให้คุณเสียได้ ด้วย MongoDB คุณสามารถควบคุมได้มากขึ้นโดยเสียความสะดวก
เครื่องมือเช่น
การใช้การบันทึกอย่างรวดเร็ว
อย่าตั้งค่าตัวเลือกการเขียน MongoDB ให้มีความเร็วสูงแต่มีความน่าเชื่อถือต่ำ โหมดนี้ "ไฟล์และลืม" ดูเหมือนเร็วเพราะคำสั่งถูกส่งคืนก่อนที่การเขียนจะเกิดขึ้น หากระบบล่มก่อนที่ข้อมูลจะถูกเขียนลงดิสก์ ระบบจะสูญหายและอยู่ในสถานะที่ไม่สอดคล้องกัน โชคดีที่ MongoDB 64 บิตเปิดใช้งานการบันทึกแล้ว
กลไกการจัดเก็บข้อมูล MMAPv1 และ WiredTiger ใช้การบันทึกเพื่อป้องกันสิ่งนี้ แม้ว่า WiredTiger จะสามารถกู้คืนเป็นความสอดคล้องครั้งล่าสุดได้
การทำเจอร์นัลช่วยให้แน่ใจว่าฐานข้อมูลอยู่ในสถานะที่สอดคล้องกันหลังการกู้คืน และเก็บรักษาข้อมูลทั้งหมดไว้จนกว่าจะถูกเขียนลงในบันทึก ความถี่ของการบันทึกได้รับการกำหนดค่าโดยใช้พารามิเตอร์
.
เพื่อให้แน่ใจว่ารายการต่างๆ ตรวจสอบให้แน่ใจว่าเปิดใช้งานการบันทึกในไฟล์การกำหนดค่าแล้ว
และความถี่ของการบันทึกจะสอดคล้องกับปริมาณข้อมูลที่คุณสามารถสูญเสียได้
การเรียงลำดับโดยไม่มีดัชนี
เมื่อค้นหาและรวบรวมข้อมูล มักจำเป็นต้องจัดเรียงข้อมูล หวังว่าการดำเนินการนี้จะเสร็จสิ้นในขั้นตอนสุดท้ายหลังจากกรองผลลัพธ์แล้ว เพื่อลดปริมาณข้อมูลที่ถูกจัดเรียง และในกรณีนี้คุณจะต้องมีเพื่อการเรียงลำดับ
หากไม่มีดัชนีที่เหมาะสม MongoDB จะทำโดยไม่มีดัชนีนั้น ขนาดรวมของเอกสารทั้งหมดมีขีดจำกัดหน่วยความจำอยู่ที่ 32 MB
ค้นหาโดยไม่รองรับดัชนี
คำค้นหามีฟังก์ชันคล้ายกับการดำเนินการ JOIN ใน SQL เพื่อให้ทำงานได้ดีที่สุด พวกเขาต้องการดัชนีของค่าของคีย์ที่ใช้เป็นคีย์ต่างประเทศ สิ่งนี้ไม่ชัดเจนเพราะไม่สะท้อนการใช้งาน explain()
. ดัชนีดังกล่าวเป็นส่วนเพิ่มเติมจากดัชนีที่เขียนไว้ explain()
ซึ่งจะถูกใช้โดยผู้ดำเนินการไปป์ไลน์ $match
и $sort
เมื่อพบกันที่จุดเริ่มต้นของไปป์ไลน์ ตอนนี้ดัชนีสามารถครอบคลุมทุกขั้นตอนได้แล้ว
การเลือกไม่ใช้การอัปเดตหลายรายการ
วิธี
ใช้เพื่อเปลี่ยนบางส่วนของเอกสารที่มีอยู่หรือทั้งเอกสาร จนถึงการแทนที่ทั้งหมด ขึ้นอยู่กับพารามิเตอร์ที่คุณระบุ
. สิ่งที่ไม่ชัดเจนนักคือจะไม่ประมวลผลเอกสารทั้งหมดในคอลเลกชันเว้นแต่คุณจะตั้งค่าตัวเลือก
เพื่ออัปเดตเอกสารทั้งหมดที่ตรงตามเกณฑ์คำขอ
อย่าลืมความสำคัญของลำดับคีย์ในตารางแฮช
ใน JSON ออบเจ็กต์ประกอบด้วยคอลเลกชันที่ไม่เรียงลำดับของคู่ชื่อ/ค่าที่มีขนาดตั้งแต่ XNUMX ขึ้นไป โดยที่ name คือสตริง และค่าคือสตริง ตัวเลข บูลีน null อ็อบเจ็กต์ หรืออาร์เรย์
น่าเสียดายที่ BSON ให้ความสำคัญกับลำดับอย่างมากเมื่อทำการค้นหา ใน MongoDB หมายถึงลำดับของคีย์ภายในวัตถุในตัว { firstname: "Phil", surname: "factor" }
- สิ่งนี้ไม่เหมือนกับ { { surname: "factor", firstname: "Phil" }
. นั่นคือ คุณต้องจัดเก็บลำดับของคู่ชื่อ/ค่าในเอกสารของคุณ หากคุณต้องการให้แน่ใจว่าจะหาได้
อย่าสับสน "โมฆะ" и "ไม่ได้กำหนด"
มูลค่า "ไม่ได้กำหนด" ไม่เคยถูกต้องใน JSON ตาม $null
ซึ่งไม่ใช่วิธีแก้ปัญหาที่ดีเสมอไป
ใช้ $limit()
ไม่มี $sort()
บ่อยครั้งเมื่อคุณพัฒนาใน MongoDB การดูตัวอย่างผลลัพธ์ที่จะถูกส่งกลับจากการสืบค้นหรือการรวมกลุ่มจะเป็นประโยชน์ สำหรับงานนี้คุณจะต้องมี $limit()
แต่ไม่ควรอยู่ในโค้ดสุดท้ายเว้นแต่คุณจะใช้มาก่อน $sort
. กลไกนี้จำเป็นเพราะไม่เช่นนั้นคุณจะไม่สามารถรับประกันลำดับของผลลัพธ์ได้ และคุณจะไม่สามารถดูข้อมูลได้อย่างน่าเชื่อถือ ที่ด้านบนของผลลัพธ์ คุณจะได้รับรายการต่างๆ ขึ้นอยู่กับการเรียงลำดับ เพื่อให้ทำงานได้อย่างน่าเชื่อถือ การสืบค้นและการรวมกลุ่มจะต้องถูกกำหนดไว้ กล่าวคือ ให้ผลลัพธ์เดียวกันทุกครั้งที่ดำเนินการ รหัสที่มี $limit()
, แต่ไม่มี $sort
จะไม่ถูกกำหนดไว้และอาจทำให้เกิดข้อผิดพลาดที่ยากต่อการติดตามในภายหลัง
ข้อสรุป
วิธีเดียวที่จะผิดหวังกับ MongoDB คือการเปรียบเทียบโดยตรงกับฐานข้อมูลประเภทอื่น เช่น DBMS หรือมาใช้งานตามความคาดหวังที่แน่นอน มันเหมือนกับการเปรียบเทียบส้มกับส้อม ระบบฐานข้อมูลมีจุดประสงค์เฉพาะ วิธีที่ดีที่สุดคือทำความเข้าใจและชื่นชมความแตกต่างเหล่านี้ด้วยตนเอง คงจะเป็นเรื่องน่าเสียดายที่จะกดดันนักพัฒนา MongoDB ให้ข้ามเส้นทางที่บังคับให้พวกเขาไปตามเส้นทาง DBMS ฉันต้องการเห็นวิธีใหม่ๆ ที่น่าสนใจในการแก้ปัญหาเก่าๆ เช่น การตรวจสอบความสมบูรณ์ของข้อมูล และการสร้างระบบข้อมูลที่ยืดหยุ่นต่อความล้มเหลวและการโจมตีที่เป็นอันตราย
การแนะนำธุรกรรม ACID ของ MongoDB ในเวอร์ชัน 4.0 เป็นตัวอย่างที่ดีในการแนะนำการปรับปรุงที่สำคัญในรูปแบบที่เป็นนวัตกรรม ธุรกรรมหลายเอกสารและหลายใบแจ้งยอดเป็นแบบอะตอมมิกแล้ว นอกจากนี้ยังสามารถปรับเวลาที่ต้องใช้ในการรับการล็อคและยุติธุรกรรมที่ค้างอยู่ รวมถึงเปลี่ยนระดับการแยก
อ่านเพิ่มเติม:
ที่มา: will.com