ข้ามไปยังเนื้อหา

บทนำและ 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 เพื่อการเติบโต

โมดูลแรกนี้ให้ทุกอย่างที่คุณต้องการก่อนที่งานจริงจะเริ่มต้น:

  1. What is MongoDB — document database เทียบกับ relational และเมื่อไรแต่ละแบบเหมาะสม
  2. Setup with Docker — รัน MongoDB บนเครื่องจาก image ทางการในไม่กี่คำสั่ง
  3. The shell and Compass — คุยกับ database จาก terminal และ GUI และการเชื่อมต่อจากแต่ละ driver
  4. Documents and BSON — รูปแบบไบนารีที่อยู่ใต้ JSON ของคุณ และ type ที่ document เก็บได้
  5. Document vs relational — การแปลคำศัพท์ relational เป็นคำศัพท์ MongoDB แบบเทียบเคียงกัน

ทุก 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 ที่บทเรียนสร้าง (พร้อมการตรวจที่รันได้ว่ามันโหลดได้):

mongosh/intro-dataset.js
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

คอร์สนี้แสดง 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 วิธีแก้คือคำเดียว:

app/intro-await.mjs
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");
saved

คอร์สนี้คือ loop เดียว: จำลอง document, เขียน (CRUD), อ่าน (querying), ทำให้การอ่านเร็ว (indexes), สรุป (aggregation), รักษาให้ถูกต้อง (transactions) และมีชีวิต (operations) โมดูล 1 ถึง 3 คือคำศัพท์ของ loop นั้น ที่เหลือคือคุณสมบัติที่เพิ่มเมื่อ loop ทำงานแล้ว

ตัวเลือกBenefitCost
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
  • “ไม่มี 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)

หน่วยข้อมูลพื้นฐานที่ MongoDB เก็บคืออะไร?
คอร์สนี้ประกอบด้วยกี่โมดูล?
โมดูลใดสอนการทำให้ query เร็ว?
โมดูลใดต้องใช้ replica set ไม่ใช่ container standalone ธรรมดา?
ใน Node เรียก members.insertOne(doc) โดยไม่ await แล้ว countDocuments() รันทันทีหลังจากนั้น การรันจริงแสดงอะไร?