บทนำและ Documents
ยินดีต้อนรับสู่ MongoDB — From Zero to Hero คอร์สนี้จะพาคุณจากคนที่ไม่เคยแตะ database มาก่อนเลย ไปสู่การออกแบบโมเดลข้อมูล query ข้อมูล สร้าง index เพื่อความเร็ว รวมข้อมูลด้วย aggregation ให้กลายเป็นรายงาน ไปจนถึงรันบน production ได้อย่างสบายมือ เราจะทำงานผ่านตัวอย่างที่จับต้องได้ตลอดทาง: โลกจำลองเล็ก ๆ ของสมาชิกห้องสมุดและหนังสือที่พวกเขายืม ตั้งใจให้เล็กไว้เพื่อให้แนวคิดหลักยังคงเป็นจุดเด่น ทุก operation จะถูกแสดงห้าแบบ — ใน shell mongosh และใน driver ของ Node.js, Python, Go, และ Rust — เพื่อให้บทเรียนนำไปใช้ได้กับ stack ที่คุณทำงานจริง
MongoDB เป็น document database: แทนที่จะเก็บข้อมูลของคุณเป็น row ในตารางที่ตายตัว MongoDB เก็บข้อมูลเป็น document — object คล้าย JSON ที่มี field, object ซ้อนใน และ array — จัดกลุ่มอยู่ใน collection document หน้าตาเป็นยังไงก็ได้ตามที่ข้อมูลของคุณเป็นโดยธรรมชาติ ดังนั้นรูปร่างของข้อมูลใน database จึงมักจะตรงกับรูปร่างของ object ในโค้ดของคุณ โดยไม่มีชั้นแปลงข้อมูลคั่นกลาง
เส้นทางข้างหน้า
หัวข้อที่มีชื่อว่า “เส้นทางข้างหน้า”คอร์สนี้มีแปดโมดูล แต่ละโมดูลต่อยอดจากอันก่อนหน้า ดังนั้นการทำตามลำดับจึงเป็นเส้นทางที่ราบรื่นที่สุด แม้ว่าทุกโมดูลจะยืนอยู่ได้ด้วยตัวเองหากคุณอยากกระโดดไปยังหัวข้อใดหัวข้อหนึ่งโดยเฉพาะ
flowchart TD M1["1. Intro & Documents"] --> M2["2. CRUD"] M2 --> M3["3. Querying"] M3 --> M4["4. Indexes"] M4 --> M5["5. Aggregation"] M5 --> M6["6. Data Modeling"] M6 --> M7["7. Transactions & Consistency"] M7 --> M8["8. Operations & Scaling"]
แต่ละโมดูลครอบคลุมอะไรบ้าง
หัวข้อที่มีชื่อว่า “แต่ละโมดูลครอบคลุมอะไรบ้าง”- Intro & Documents — โมดูลที่คุณกำลังอยู่ตอนนี้ document database คืออะไร วิธีรัน MongoDB บนเครื่องด้วย Docker, shell และ Compass, และ BSON document จริง ๆ คืออะไร
- CRUD — สี่คำกริยาประจำวัน: การสร้าง อ่าน อัปเดต และลบ document
- Querying — การกรองด้วย operator, การจัดเรียง, การจำกัดจำนวน, การ project field, และการแบ่งหน้าผลลัพธ์
- Indexes — ทำให้ query เร็วขึ้น เข้าใจว่า index มีต้นทุนอะไร และอ่าน query plan
- Aggregation — pipeline ที่จัดกลุ่ม ปรับรูปร่าง และสรุปข้อมูลให้กลายเป็นรายงาน
- Data Modeling — การตัดสินใจว่าเมื่อไรควร embed ข้อมูลที่เกี่ยวข้อง และเมื่อไรควรเก็บไว้ใน collection แยกต่างหาก
- Transactions & Consistency — atomicity หลาย document, read และ write concern, และการรับประกันที่คุณพึ่งพาได้
- Operations & Scaling — การ backup, replica set เพื่อความทนทาน, และ sharding เพื่อการเติบโต
โมดูลนี้วางโครงไว้อย่างไร
หัวข้อที่มีชื่อว่า “โมดูลนี้วางโครงไว้อย่างไร”โมดูลแรกนี้ให้ทุกอย่างที่คุณต้องการก่อนที่งานจริงจะเริ่มต้น:
- What is MongoDB — document database เทียบกับ relational และเมื่อไรแต่ละแบบเหมาะสม
- Setup with Docker — รัน MongoDB บนเครื่องจาก image ทางการในไม่กี่คำสั่ง
- The shell and Compass — คุยกับ database จาก terminal และ GUI และการเชื่อมต่อจากแต่ละ driver
- Documents and BSON — รูปแบบไบนารีที่อยู่ใต้ JSON ของคุณ และ type ที่ document เก็บได้
- Document vs relational — การแปลคำศัพท์ relational เป็นคำศัพท์ MongoDB แบบเทียบเคียงกัน
เคล็ดลับและข้อควรระวัง
หัวข้อที่มีชื่อว่า “เคล็ดลับและข้อควรระวัง”- คุณไม่จำเป็นต้องท่องจำอะไรในนี้ เป้าหมายของโมดูลนี้คือความคล่องกับคำศัพท์ — document, collection, BSON,
_id— เพื่อให้โมดูลถัด ๆ ไปอ่านได้ลื่นไหล - ทุกอย่างรันบนเครื่อง เราใช้ Docker เพื่อให้ไม่มีอะไรต้องติดตั้งถาวร และไม่มีอะไรต้องตามเก็บกวาดด้วยมือทีหลัง
- ถ้าคุณรู้ SQL อยู่แล้ว บทเรียนสุดท้ายของโมดูลนี้คือทางที่เร็วที่สุดในการ map สิ่งที่คุณรู้เข้ากับ MongoDB
ข้อแลกเปลี่ยน
หัวข้อที่มีชื่อว่า “ข้อแลกเปลี่ยน”| ตัวเลือก | Benefit | Cost |
|---|---|---|
| schema ที่ยืดหยุ่นของ document model | เริ่มเขียนโค้ดและ ship ฟีเจอร์ได้เร็วโดยไม่ต้องออกแบบ schema ให้สมบูรณ์ตั้งแต่วันแรก | ไม่มีการรับประกันตอน compile time ว่าทุก document ใน collection จะมีรูปร่างเดียวกัน ความสม่ำเสมอเป็นหน้าที่ของทีมคุณเอง |
| BSON ที่มี type มากกว่า JSON | เก็บ Date, ObjectId, Decimal128 ได้แม่นยำโดยไม่ต้องแปลงค่าเอง | driver แต่ละภาษา map type พวกนี้เข้ากับ native type ของตัวเองต่างกัน ต้องเข้าใจ mapping ก่อนใช้งานจริง |
ข้อผิดพลาดที่พบบ่อย
หัวข้อที่มีชื่อว่า “ข้อผิดพลาดที่พบบ่อย”- คิดว่า “ไม่มี schema” แปลว่าไม่ต้องออกแบบอะไรเลย — schema ที่ยืดหยุ่นยังต้องการวินัย ทีมที่ปล่อยให้ document แต่ละใบมีรูปร่างต่างกันไปเรื่อย ๆ โดยไม่ตั้งใจจะเจอ bug ตอน query ทีหลัง
- ข้ามลำดับโมดูลเพราะคิดว่าแต่ละโมดูลแยกอิสระเต็มที่ — โมดูลต่อยอดจากกัน โดยเฉพาะคำศัพท์ใน Intro & Documents ที่โมดูลหลัง ๆ ใช้ซ้ำตลอด การข้ามไปเรียน Aggregation ก่อนอาจทำให้งงกับคำว่า document, field, BSON
- มองว่า MongoDB คือ database เดียวที่เหมาะกับทุกงาน — โมดูลนี้จะพูดถึงเมื่อไร document database เหมาะและเมื่อไร relational database ยังเป็นตัวเลือกที่ดีกว่า การเลือกอย่างตั้งใจสำคัญกว่าการใช้เพราะกระแส
💡 ตัวอย่างจากของจริง
eBay — ใช้ MongoDB เป็น metadata store สำหรับข้อมูลที่มีรูปร่างหลากหลายมากในแต่ละหมวดสินค้า ซึ่ง schema ที่ยืดหยุ่นของ document model รองรับได้โดยไม่ต้องมี table แยกสำหรับทุกหมวด
Forbes — ใช้ MongoDB เป็น backend ของ CMS เพราะเนื้อหาบทความแต่ละประเภท (ข่าว, วิดีโอ, gallery) มีโครงสร้าง field ที่ต่างกัน การเก็บเป็น document เดียวต่อบทความง่ายกว่าการพยายามยัดทุกประเภทลงตาราง relational เดียว