บทนำและ 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 แบบเทียบเคียงกัน
runtime เบื้องหลังทุกผลลัพธ์
หัวข้อที่มีชื่อว่า “runtime เบื้องหลังทุกผลลัพธ์”ทุก output ในคอร์สนี้ถูกจับมา ไม่ได้พิมพ์เอง: mongo 8.3.11 (สิ่งที่ mongo:8 resolve ได้เมื่อ 2026-09-30), mongosh 2.11.1, Node.js driver 7.7.0 รันบน Mac เครื่องเดียวกับ container แท็บ Python, Go และ Rust สะท้อนพฤติกรรมที่พิสูจน์แล้วของ shell/Node และเมื่อบทใดระบุ ก็รันหนึ่งครั้งในโปรแกรม scratch (PyMongo 4.18.2, Go driver v2.9.1, Rust driver 3.9.1) แต่ไม่ถูกรันโดยตัวตรวจอัตโนมัติของคอร์ส ซึ่งครอบคลุม fence ของ mongosh และ Node โมดูล 1 ถึง 6 ใช้ได้กับ MongoDB ทุกแบบ; โมดูล 7 (transaction, change stream) ต้องการ replica set ซึ่งบท Setup แสดงวิธีเริ่ม
ทุกบทเรียน seed ข้อมูลของตัวเอง คุณจึงเปิดบทไหนก็ได้โดยลำพัง รูปร่างข้อมูลเหมือนกันตลอดทุกโมดูล — นี่คือ dataset ที่บทเรียนสร้าง (พร้อมการตรวจที่รันได้ว่ามันโหลดได้):
db.members.insertMany([ { name: "Ada", joined: 2023, fines: 0, city: "Cambridge", borrowed: ["Compilers"] }, { name: "Grace", joined: 2024, fines: 0, city: "Arlington", borrowed: ["Compilers", "Algorithms"] }, { name: "Linus", joined: 2023, fines: 2, city: "Helsinki", borrowed: [] },]);db.sales.insertOne({ title: "Compilers", genre: "cs", quantity: 2, price: 45.5, buyer: "Ada" });console.log(db.members.countDocuments(), db.sales.countDocuments());assert.strictEqual(db.members.countDocuments({ fines: { $gt: 0 } }), 1);3 1เคล็ดลับและข้อควรระวัง
หัวข้อที่มีชื่อว่า “เคล็ดลับและข้อควรระวัง”- คุณไม่จำเป็นต้องท่องจำอะไรในนี้ เป้าหมายของโมดูลนี้คือความคล่องกับคำศัพท์ — document, collection, BSON,
_id— เพื่อให้โมดูลถัด ๆ ไปอ่านได้ลื่นไหล - ทุกอย่างรันบนเครื่อง เราใช้ Docker เพื่อให้ไม่มีอะไรต้องติดตั้งถาวร และไม่มีอะไรต้องตามเก็บกวาดด้วยมือทีหลัง
- ถ้าคุณรู้ SQL อยู่แล้ว บทเรียนสุดท้ายของโมดูลนี้คือทางที่เร็วที่สุดในการ map สิ่งที่คุณรู้เข้ากับ MongoDB
อ่านโค้ดที่ AI สร้าง
หัวข้อที่มีชื่อว่า “อ่านโค้ดที่ AI สร้าง”คอร์สนี้แสดง driver Node.js เคียงข้าง shell และข้อผิดพลาด Node ที่พบบ่อยที่สุดในโค้ดที่ AI เขียนคือลืม await:
🐛 หา bug ในโค้ดนี้
// AI comment: "insert the member, then confirm the count"const members = db.collection("members");members.insertOne({ name: "Grace" });const n = await members.countDocuments();console.log(n === 1 ? "saved" : "missing");เฉลย
insertOne คืน promise; ถ้าไม่มี await โค้ดจะวิ่งล้ำไปก่อน เรารันรูปแบบนี้ 20 ครั้ง (ลบ collection ก่อนทุกครั้ง): จำนวนที่นับได้คือ 0 ใน 15 จาก 20 ครั้ง การตรวจจึงพิมพ์ “missing” สำหรับการเขียนที่สำเร็จในอีกเสี้ยววินาที การ reject ของ promise ที่ไม่ await ก็หายไปด้วย — insert ที่ duplicate key ล้มเหลวอย่างเงียบจนกว่าเราจะต่อ .catch วิธีแก้คือคำเดียว:
const members = db.collection("members");await members.deleteMany({});await members.insertOne({ name: "Grace" });const n = await members.countDocuments();console.log(n === 1 ? "saved" : "missing");if (n !== 1) throw new Error("expected 1");savedMental Model
หัวข้อที่มีชื่อว่า “Mental Model”คอร์สนี้คือ loop เดียว: จำลอง document, เขียน (CRUD), อ่าน (querying), ทำให้การอ่านเร็ว (indexes), สรุป (aggregation), รักษาให้ถูกต้อง (transactions) และมีชีวิต (operations) โมดูล 1 ถึง 3 คือคำศัพท์ของ loop นั้น ที่เหลือคือคุณสมบัติที่เพิ่มเมื่อ loop ทำงานแล้ว
ข้อแลกเปลี่ยน
หัวข้อที่มีชื่อว่า “ข้อแลกเปลี่ยน”| ตัวเลือก | Benefit | Cost |
|---|---|---|
| schema ที่ยืดหยุ่นของ document model | เริ่มเขียนโค้ดและส่งฟีเจอร์ได้เร็ว โดยไม่ต้องออกแบบ schema ให้ครบตั้งแต่วันแรก | ไม่มีการรับประกันตอน compile ว่า document ทุกใบใน collection มีรูปร่างเดียวกัน — ความสม่ำเสมอเป็นความรับผิดชอบของทีมเอง |
| BSON ที่มี type มากกว่า JSON | เก็บ Date, ObjectId และ Decimal128 ได้ตรงตัว โดยไม่ต้องแปลงค่าเอง | driver แต่ละภาษา map type เหล่านี้ไปยัง type ดั้งเดิมของตัวเองต่างกัน (บท Documents and BSON วัดให้ดู) |
| container standalone สำหรับเรียน | รันง่ายที่สุด รองรับ root user | ไม่มี transaction หรือ change stream; โมดูล 7 ต้องใช้แบบ replica set |
Common Misconceptions
หัวข้อที่มีชื่อว่า “Common Misconceptions”- “ไม่มี schema แปลว่าไม่ต้องออกแบบ” — schema ยืดหยุ่นยังต้องมีวินัย บท What is MongoDB แสดง field ที่พิมพ์ผิดถูกรับเงียบ ๆ
- “แต่ละโมดูลแยกอิสระเต็มที่” — โมดูลหลังพึ่งคำศัพท์ที่นี่ (document, field, BSON,
_id) - “MongoDB เหมาะกับทุกงาน” — โมดูลนี้ครอบคลุมเมื่อ relational database ยังดีกว่า
- “container Docker จากบท Setup ครอบคลุมทั้งคอร์ส” — แบบ standalone ไม่: โมดูล 7 ต้องการ replica set
- “ไม่มี
awaitก็ยังใช้ได้ถ้าเขียนเร็ว” — 15 จาก 20 การนับเป็น 0 ในการรันด้านบน
ตัวอย่างจากของจริง
eBay — ใช้ MongoDB เป็นหนึ่งใน core enterprise data platform ขององค์กร รองรับแอปที่ลูกค้าใช้งานจริงบน ebay.com รวมถึง product catalog ที่ scale replica set ออกไปหลายสิบ node เพื่อรองรับการอ่านปริมาณมหาศาล (mongodb.com/customers/ebay, 2017)
Forbes — ใช้ MongoDB Atlas เป็น backend ของ CMS ที่ให้บริการเนื้อหาทั้งหมดบน Forbes.com โครงสร้างข้อมูลที่ยืดหยุ่นทำให้ทีมเพิ่ม component ได้เร็ว และลดเวลา build เฉลี่ยจาก 25 เหลือ 9 นาที (mongodb.com/customers/forbes, 2019)