ทำความรู้จัก MongoDB และแนวคิดฐานข้อมูลแบบ Document
เวลาเราสร้างแอปพลิเคชันขึ้นมาสักตัว ข้อมูลถือเป็นหัวใจสำคัญที่สุดในการทำงาน MongoDB (ฐานข้อมูลที่เก็บข้อมูลในรูปแบบเอกสาร) คือเครื่องมือยอดนิยมในสายงาน Backend (ส่วนการทำงานหลังบ้านที่ผู้ใช้มองไม่เห็น) เพราะมันยืดหยุ่นกว่าฐานข้อมูลแบบตารางทั่วไปที่เราเคยเห็นใน Excel
ลองนึกภาพว่าคุณกำลังเก็บข้อมูลสมุดโทรศัพท์ ถ้าเป็นฐานข้อมูลแบบเก่า คุณต้องกำหนดช่องให้ชัดเจนว่ามีชื่อ เบอร์โทร และอีเมล แต่ถ้าวันหนึ่งคุณอยากเพิ่มช่อง "ชื่อเล่น" เข้าไป คุณต้องแก้ไขโครงสร้างตารางทั้งหมด ซึ่งวุ่นวายมากสำหรับโปรแกรมเมอร์มือใหม่
แต่ MongoDB เก็บข้อมูลเป็น Document (หน่วยข้อมูลที่เก็บเป็นคู่ของชื่อและค่าคล้ายไฟล์ JSON) ทำให้เราสามารถเพิ่มหรือลดข้อมูลแต่ละรายการได้อิสระ นี่คือเหตุผลที่มันถูกนำมาใช้ในโปรเจกต์สมัยใหม่จำนวนมาก เพราะช่วยให้เราพัฒนาแอปฯ ได้รวดเร็วและปรับเปลี่ยนความต้องการได้ง่ายขึ้นนั่นเอง
ติดตั้ง Mongoose เพื่อเชื่อมต่อกับฐานข้อมูล
ในการเขียนโปรแกรมด้วย Node.js (สภาพแวดล้อมสำหรับรันภาษา JavaScript นอกเบราว์เซอร์) เราจะไม่คุยกับฐานข้อมูลตรงๆ แต่เราจะใช้ตัวช่วยที่เรียกว่า Mongoose (เครื่องมือที่ช่วยจัดการฐานข้อมูลให้ง่ายขึ้น) เพื่อให้เราสั่งงาน MongoDB ได้ด้วยคำสั่งภาษา JavaScript ที่คุ้นเคย
ขั้นตอนแรกให้คุณเปิด Terminal (หน้าต่างพิมพ์คำสั่ง) ในโปรเจกต์ของคุณ แล้วพิมพ์คำสั่ง npm install mongoose เพื่อดึงไลบรารีนี้เข้ามา หลังจากนั้นเราต้องสร้างไฟล์เชื่อมต่อเพื่อให้แอปฯ ของเรารู้จักกับฐานข้อมูลที่ติดตั้งไว้ในเครื่อง
จุดที่มือใหม่มักพลาดคือการลืมรอให้การเชื่อมต่อเสร็จสิ้นก่อนเริ่มทำคำสั่งอื่น การจัดการ Asynchronous (การทำงานแบบไม่รอให้เสร็จทีละขั้นตอน) เป็นเรื่องสำคัญมากใน Node.js ดังนั้นเราต้องเขียนโค้ดให้มันเชื่อมต่อให้สำเร็จก่อนแล้วค่อยเริ่มทำงานส่วนถัดไป
// นำเข้า mongoose เข้ามาใช้งาน
const mongoose = require('mongoose');
// เชื่อมต่อไปยังฐานข้อมูลในเครื่องชื่อ my_database
mongoose.connect('mongodb://localhost:27017/my_database')
.then(() => console.log('เชื่อมต่อสำเร็จแล้ว'))
.catch(err => console.error('เชื่อมต่อไม่สำเร็จ:', err));
ในโค้ดนี้ require คือการเรียกใช้เครื่องมือที่ติดตั้งไว้ ส่วน mongoose.connect คือการส่งที่อยู่ฐานข้อมูลไปให้โปรแกรมเชื่อมต่อ ผลลัพธ์ที่ควรเห็นบน Terminal คือข้อความ เชื่อมต่อสำเร็จแล้ว หากทุกอย่างถูกต้อง แต่ถ้าเห็นข้อความแจ้งเตือนสีแดงให้ตรวจสอบว่าเปิดโปรแกรม MongoDB ในเครื่องไว้หรือยัง
สร้าง Schema และ Model เพื่อกำหนดโครงสร้างข้อมูล
แม้ว่า MongoDB จะยืดหยุ่น แต่ในงานจริงเราต้องมี Schema (พิมพ์เขียวหรือโครงร่างที่กำหนดว่าข้อมูลต้องมีหน้าตาอย่างไร) เพื่อป้องกันไม่ให้ข้อมูลมั่วจนเกินไป การกำหนดโครงสร้างช่วยให้เรามั่นใจว่าทุกครั้งที่มีการบันทึกข้อมูล จะมีฟิลด์ที่จำเป็นครบถ้วนเสมอ
เมื่อเรามี Schema แล้ว เราจะแปลงมันเป็น Model (ตัวแทนของคอลเลกชันในฐานข้อมูลที่เอาไว้เรียกใช้คำสั่งต่างๆ) เพื่อใช้ในการสร้าง อ่าน แก้ไข หรือลบข้อมูล เหมือนกับเราสร้างแม่พิมพ์ไว้แล้วนำแม่พิมพ์นั้นไปปั๊มข้อมูลออกมาใช้งานจริงในระบบ
เปรียบเทียบง่ายๆ เหมือนการทำแบบฟอร์มสมัครสมาชิก ถ้าเราไม่กำหนดว่าต้องมี "ชื่อ" และ "อีเมล" ใครจะส่งอะไรมาก็ได้ แต่ถ้าเราใช้ Schema กำหนดไว้ ระบบจะปฏิเสธข้อมูลที่ไม่มีช่องเหล่านี้ทันที ซึ่งเป็นแนวปฏิบัติที่ดีในการเขียนโค้ดให้ปลอดภัยและจัดการได้ง่าย
// สร้างโครงสร้างข้อมูลสำหรับผู้ใช้งาน
const userSchema = new mongoose.Schema({
name: String,
email: { type: String, required: true },
age: Number
});
// สร้าง Model จาก Schema
const User = mongoose.model('User', userSchema);
โค้ดส่วนแรก new mongoose.Schema คือการกำหนดว่าผู้ใช้ต้องมีชื่อ อีเมล และอายุ โดย required: true หมายความว่าห้ามเว้นช่องอีเมลว่างเด็ดขาด ส่วน mongoose.model คือการสร้างคลาส User เพื่อนำไปใช้บันทึกข้อมูลลงฐานข้อมูลจริง ผลลัพธ์คือเราจะได้ Object ที่มีฟังก์ชันพร้อมให้เราเรียกใช้งาน เช่น User.create() หรือ User.find()
การเพิ่มข้อมูล (Create) และการสอบถามข้อมูล (Querying)
เมื่อเตรียม Model เรียบร้อยแล้ว ขั้นตอนต่อไปคือการ Query (คำสั่งถามข้อมูลหรือดึงข้อมูลจากฐานข้อมูล) เราสามารถเพิ่มข้อมูลใหม่ด้วยคำสั่ง save หรือ create และดึงข้อมูลออกมาดูด้วยคำสั่ง find ซึ่งเป็นคำสั่งพื้นฐานที่สุดที่โปรแกรมเมอร์ต้องใช้ทุกวัน
สำหรับการดึงข้อมูล เราสามารถระบุเงื่อนไขได้ละเอียด เช่น หาผู้ใช้ที่มีอายุมากกว่า 20 ปี หรือหาผู้ใช้ที่ชื่อตรงกับที่ระบุไว้ การเข้าใจวิธีเขียนเงื่อนไขเหล่านี้จะช่วยให้เราสร้างระบบที่ค้นหาข้อมูลได้แม่นยำและรวดเร็ว ไม่ว่าฐานข้อมูลจะมีขนาดใหญ่แค่ไหนก็ตาม
มือใหม่ควรระวังเรื่องการใช้คำสั่งดึงข้อมูลโดยไม่มีเงื่อนไข เพราะถ้าข้อมูลในระบบมีเป็นล้านรายการ การสั่ง find แบบว่างเปล่าอาจทำให้ระบบค้างได้ ควรฝึกนิสัยการจำกัดจำนวนข้อมูลหรือใช้เงื่อนไขที่เหมาะสมเสมอเพื่อให้แอปฯ ของเราทำงานได้ลื่นไหล
// เพิ่มข้อมูลใหม่
const newUser = new User({ name: 'Somchai', email: 'somchai@test.com', age: 25 });
await newUser.save();
// ดึงข้อมูลทั้งหมดที่มีอายุ 25 ปี
const users = await User.find({ age: 25 });
console.log(users);
บรรทัดแรกเป็นการสร้าง Object ข้อมูลตาม Model ที่วางไว้ บรรทัด await newUser.save() คือการสั่งให้บันทึกลงฐานข้อมูลจริงโดยใช้ await (คำสั่งรอให้ทำงานเสร็จ) ส่วน User.find คือการค้นหาข้อมูล ผลลัพธ์ที่ได้จะเป็น Array (รายการข้อมูล) ของผู้ใช้ที่มีอายุ 25 ปีทั้งหมดแสดงออกมาทางหน้าจอ
การจัดการข้อผิดพลาดและแนวปฏิบัติที่ดี
การเขียนโค้ดติดต่อฐานข้อมูลมักเกิดปัญหาได้บ่อย เช่น เน็ตหลุด หรือฐานข้อมูลปิดตัวลง เราจึงต้องมี Error Handling (วิธีจัดการเมื่อเกิดข้อผิดพลาด) เพื่อให้แอปฯ แสดงข้อความแจ้งเตือนแทนที่จะพังไปดื้อๆ การใช้ try-catch จึงเป็นสิ่งที่ขาดไม่ได้เลย
นอกจากนี้ การออกแบบฐานข้อมูลควรคำนึงถึงความปลอดภัย อย่าลืมตรวจสอบข้อมูลก่อนบันทึกเสมอ และพยายามอย่าเก็บข้อมูลที่ละเอียดอ่อนเกินจำเป็นไว้ในฐานข้อมูลโดยไม่เข้ารหัส เพราะความปลอดภัยเป็นทักษะที่แยกโปรแกรมเมอร์มืออาชีพออกจากมือสมัครเล่น
สุดท้ายคือเรื่องวินัยในการตั้งชื่อตัวแปรและโครงสร้างไฟล์ ให้แยกส่วนการเชื่อมต่อกับส่วนการใช้งานออกจากกันเสมอ เพื่อให้โปรเจกต์ของคุณดูสะอาดตาและแก้ไขได้ง่ายในอนาคต เมื่อคุณเริ่มทำโปรเจกต์ขนาดใหญ่ การจัดระเบียบโค้ดที่ดีจะช่วยให้คุณทำงานร่วมกับทีมได้โดยไม่เกิดปัญหา
// ตัวอย่างการใช้ try-catch เพื่อดักจับข้อผิดพลาด
try {
const user = await User.create({ name: 'Somying', email: 'somying@test.com' });
console.log('บันทึกสำเร็จ:', user);
} catch (error) {
console.error('เกิดข้อผิดพลาด:', error.message);
}
try คือส่วนที่พยายามรันโค้ด ถ้ามีบรรทัดไหนพัง โปรแกรมจะกระโดดไปทำงานในส่วน catch ทันที บรรทัด error.message จะบอกเราว่าเกิดอะไรขึ้น เช่น อีเมลซ้ำหรือลืมใส่ข้อมูลที่จำเป็น ผลลัพธ์คือหากบันทึกผ่านเราจะเห็นข้อมูลผู้ใช้ใหม่ แต่ถ้าไม่ผ่านเราจะเห็นข้อความแจ้งเตือนที่อ่านเข้าใจง่ายแทน
สรุป: เริ่มต้นก้าวแรกสู่การเป็น Backend Developer
การทำความเข้าใจ MongoDB และ Mongoose คือก้าวสำคัญของคนที่อยากเป็นโปรแกรมเมอร์สาย Backend เพราะมันเป็นเทคโนโลยีพื้นฐานที่ใช้กันจริงในบริษัทส่วนใหญ่ คุณได้เรียนรู้วิธีเชื่อมต่อ การกำหนดโครงสร้างข้อมูล และการค้นหาข้อมูลเบื้องต้น ซึ่งเป็นสิ่งที่ต้องใช้ในทุกโปรเจกต์
สมมติว่าคุณกำลังสร้างแอปฯ "บันทึกรายการสิ่งที่ต้องทำ" (To-Do List) สิ่งที่คุณต้องทำคือสร้าง Model สำหรับเก็บงานแต่ละงาน มีชื่อหัวข้อและสถานะว่าทำเสร็จหรือยัง จากนั้นใช้คำสั่ง find ดึงรายการทั้งหมดมาแสดงผล และใช้ create เพื่อเพิ่มงานใหม่เข้าไปในระบบ
กุญแจสำคัญคือการฝึกฝนลงมือทำจริง อย่าเพียงแค่อ่าน แต่ให้ลองติดตั้ง MongoDB ในเครื่องแล้วเขียนโค้ดตามตัวอย่างที่ให้ไป หากติดปัญหาตรงไหน การค้นหาข้อผิดพลาดจากข้อความที่แสดงใน Terminal คือวิธีที่ดีที่สุดในการเรียนรู้และพัฒนาตัวเองให้เก่งขึ้นในเส้นทางสายโปรแกรมเมอร์นี้