
หากคุณกำลังหาฐานข้อมูลที่ เก็บข้อมูลแบบ Document (JSON) ปรับ Schema ได้ง่าย และเหมาะกับแอปสมัยใหม่อย่าง Node.js, Realtime app, IoT — MongoDB คือ NoSQL ที่ได้รับความนิยมที่สุดในโลก ใช้กับ Discord, eBay, Adobe
บทความนี้พาคุณติดตั้ง MongoDB Community Edition บน VPS Ubuntu 22.04 ตั้งแต่เพิ่ม Repository, สร้าง User, ตั้ง Authentication, ไปจนถึงเปิดให้แอปภายนอกเชื่อมต่อ พร้อมคำสั่ง mongosh ที่ต้องรู้
ต้องเตรียม: VPS Ubuntu 22.04 (RAM 2GB ขึ้นไป — MongoDB กิน RAM กว่า MySQL/PostgreSQL), Sudo access, เปิด Port 22 สำหรับ SSH
MongoDB คืออะไร — Document Database ทำงานอย่างไร
MongoDB เก็บข้อมูลในรูปแบบ BSON (Binary JSON) แต่ละ record เรียกว่า "Document" และ Document ถูกจัดเก็บใน "Collection" (เทียบเท่ากับ Table ใน SQL) แต่ละ Document ไม่จำเป็นต้องมีโครงสร้างเหมือนกัน ทำให้ปรับ Schema ได้ทันทีโดยไม่ต้อง ALTER TABLE
MongoDB vs MySQL — เลือกอันไหน
| หัวข้อ | MongoDB | MySQL |
|---|---|---|
| โครงสร้าง | Document (BSON / JSON) | Table (Row/Column) |
| Schema | Flexible — เพิ่ม field ได้ทันที | Fixed — ต้อง ALTER TABLE |
| Query | JSON-like query (find, aggregate) | SQL standard |
| Transaction | รองรับตั้งแต่ v4.0 (multi-doc) | InnoDB เต็มรูปแบบ |
| เหมาะกับ | แอป Realtime, Content, IoT, แอป Mobile | เว็บทั่วไป, ERP, ระบบบัญชี |
ขั้นที่ 1 — เพิ่ม MongoDB Official Repository
Ubuntu repository มี MongoDB เวอร์ชันเก่า — ใช้ official repo จะได้ v7.0 ล่าสุด เริ่มจาก import GPG key ของ MongoDB:
sudo apt update && sudo apt install -y gnupg curl curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | \ sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor
เพิ่ม source list ของ MongoDB 7.0 สำหรับ Ubuntu 22.04 (Jammy):
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | \ sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
ขั้นที่ 2 — ติดตั้งและเริ่มต้น MongoDB
sudo apt update sudo apt install -y mongodb-org sudo systemctl start mongod sudo systemctl enable mongod sudo systemctl status mongod
ถ้า status เป็น active (running) แปลว่าติดตั้งสำเร็จ ทดสอบเชื่อมต่อด้วย mongosh:
mongosh
เมื่อเห็น prompt test> แสดงว่าเข้ามาที่ MongoDB Shell แล้ว ลองดู database:
show dbs
ขั้นที่ 3 — เปิด Authentication (สำคัญมาก)
โดย default MongoDB ไม่มี password — ต้องเปิด Authentication ก่อนใช้งานโปรดักชัน เริ่มจากสร้าง admin user:
mongosh
use admin
db.createUser({
user: "adminUser",
pwd: "StrongAdminPassword!",
roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
})
exitเปิด config ของ MongoDB:
sudo nano /etc/mongod.conf
หา section security (หรือเพิ่มใหม่) แล้วใส่:
security: authorization: enabled
Restart ให้ค่ามีผล:
sudo systemctl restart mongod
ทดสอบเข้าใหม่ด้วย user/password ที่สร้าง:
mongosh -u adminUser -p --authenticationDatabase admin
ขั้นที่ 4 — สร้าง Database และ User สำหรับแอป
ไม่ควรใช้ admin user ในแอป — สร้าง user เฉพาะแยกตาม database:
use myapp_db
db.createUser({
user: "myapp",
pwd: "AppPassword123!",
roles: [ { role: "readWrite", db: "myapp_db" } ]
})ทดสอบ Login:
mongosh -u myapp -p --authenticationDatabase myapp_db myapp_db
ขั้นที่ 5 — เปิดให้แอปภายนอกเชื่อมต่อ
โดย default MongoDB bind เฉพาะ 127.0.0.1 ถ้าต้องการให้แอปบนเครื่องอื่นเชื่อม ต้องแก้ bindIp ใน /etc/mongod.conf:
net:
port: 27017
bindIp: 0.0.0.0 # รับทุก interface — ระวัง! ต้องคู่กับ firewall⚠️ อันตราย: bindIp: 0.0.0.0 เปิดให้ทุก IP บนอินเทอร์เน็ตเชื่อมต่อได้ — ต้องเปิด Firewall จำกัด IP เสมอ และต้องเปิด Authentication ใน ขั้นที่ 3 ก่อน
ตั้ง UFW อนุญาตเฉพาะ IP ของแอป:
sudo ufw allow from YOUR_APP_IP to any port 27017
ขั้นที่ 6 — Backup ด้วย mongodump
MongoDB มาพร้อมเครื่องมือ mongodump สำหรับสำรองข้อมูล:
mongodump --uri="mongodb://myapp:[email protected]:27017/myapp_db" \ --out=/backup/mongo_$(date +%F)
คืนค่าจาก backup:
mongorestore --uri="mongodb://myapp:[email protected]:27017/myapp_db" \ --drop /backup/mongo_2026-05-15/myapp_db
เคล็ดลับ: ตั้ง cron job รัน mongodump ทุกตี 3 แล้วใช้ rclone ส่งขึ้น S3 / Google Drive จะปลอดภัยกว่าเก็บไว้เครื่องเดียว
ปรับจูน MongoDB บน Ubuntu VPS ให้พร้อมโปรดักชัน
หลังติดตั้งและเปิด Authentication เรียบร้อยแล้ว ยังมีอีกหลายจุดที่ควรตั้งค่าก่อนปล่อยให้แอปจริงใช้งานบน VPS โดยเฉพาะเรื่อง WiredTiger cache, disk, swap และ log เพราะ MongoDB เป็นบริการที่กิน RAM มากกว่าฐานข้อมูล SQL ทั่วไป ถ้าตั้งค่าผิดอาจทำให้ระบบ OOM (Out Of Memory) แล้ว mongod ถูก kernel kill กลางคัน
โดย default MongoDB จะใช้ WiredTiger cache เท่ากับ 50% ของ RAM ลบ 1GB บน VPS ขนาดเล็กที่แชร์ RAM กับ Nginx, PHP-FPM หรือ Node.js ควรกำหนดเพดาน cache เองเพื่อกันไม่ให้ MongoDB กิน RAM จนบริการอื่นล่ม เปิด /etc/mongod.conf แล้วเพิ่มใน section storage:
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 1.0 # จำกัด cache ที่ 1GB สำหรับ VPS RAM 2GBVPS RAM น้อยควรเพิ่ม swap กันพังเวลามี query หนัก และปิด Transparent Huge Pages (THP) ตามคำแนะนำของ MongoDB เพราะ THP ทำให้ latency แกว่ง:
sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
เคล็ดลับ: ดู RAM ที่ MongoDB ใช้จริงด้วย db.serverStatus().wiredTiger.cache ใน mongosh หรือดูภาพรวมระบบด้วย htop ถ้า cache เต็มบ่อยให้พิจารณาอัปเกรด RAM ของ VPS
สร้าง Index เพื่อให้ Query เร็วขึ้น
เหมือน SQL — ถ้า Collection มี Document จำนวนมากแต่ไม่มี Index คำสั่ง find() จะทำ Collection Scan อ่านทุก Document ทำให้ช้าลงเรื่อย ๆ เมื่อข้อมูลโต ตรวจว่า query ไหนช้าด้วย explain():
db.users.find({ email: "[email protected]" }).explain("executionStats")ถ้าเห็น COLLSCAN แปลว่ายังไม่มี Index ที่ field นั้น สร้าง Index เพิ่ม:
db.users.createIndex({ email: 1 }, { unique: true })
db.orders.createIndex({ userId: 1, createdAt: -1 }) # compound index
db.users.getIndexes() # ดู index ทั้งหมดกฎทอง: สร้าง Index เฉพาะ field ที่ใช้ใน query/sort บ่อย ๆ เท่านั้น — Index ทุกตัวกิน disk และทำให้การ insert/update ช้าลงเล็กน้อย อย่าสร้างเผื่อไว้ทุก field
ตรวจสุขภาพและดู Log ของ MongoDB
เมื่อปล่อยให้แอปจริงใช้งานบน VPS แล้ว ควรเฝ้าดูสถานะของ MongoDB เป็นระยะ เพราะปัญหาส่วนใหญ่ เช่น connection เต็ม, query ช้า, หรือ disk ใกล้เต็ม จะมีสัญญาณเตือนใน log ก่อนที่ระบบจะล่มจริง ดู log ของ MongoDB ที่ทำงานผ่าน systemd ได้ทันทีด้วย:
sudo systemctl status mongod sudo journalctl -u mongod -n 50 --no-pager sudo tail -f /var/log/mongodb/mongod.log
ภายใน mongosh มีคำสั่งดูสถานะแบบ realtime ที่ใช้บ่อยเวลามีปัญหา เช่น ดูจำนวน connection ปัจจุบัน, operation ที่กำลังรัน และสถิติของแต่ละ database:
db.serverStatus().connections # จำนวน connection ที่เปิดอยู่ db.currentOp() # operation ที่กำลังทำงาน db.stats() # ขนาด database + จำนวน document
ถ้าเจอ query ที่ช้าผิดปกติ เปิด Database Profiler เพื่อบันทึก operation ที่ใช้เวลานานเกินเกณฑ์ (เช่น 100 มิลลิวินาที) แล้วค่อยไปวิเคราะห์ทีหลังว่าควรเพิ่ม Index ตรงไหน:
db.setProfilingLevel(1, { slowms: 100 })
db.system.profile.find().sort({ ts: -1 }).limit(5)ระวัง disk เต็ม: MongoDB ใช้ disk มากกว่า MySQL และ log file โตได้เรื่อย ๆ — ตรวจ df -h สม่ำเสมอ และตั้ง log rotation ผ่าน logRotate ใน config เพราะถ้า disk เต็ม mongod จะหยุดเขียนและบริการล่มทันที
เมื่อไหร่ควรใช้ MongoDB และเมื่อไหร่ควรใช้ SQL
MongoDB ไม่ได้เหนือกว่า MySQL/PostgreSQL ในทุกสถานการณ์ — แต่ละแบบเหมาะกับงานคนละลักษณะ การเลือกผิดตั้งแต่ต้นทำให้ต้องเขียนโค้ดอ้อมหรือย้ายฐานข้อมูลทีหลังซึ่งเจ็บปวดมาก ลองพิจารณาจากลักษณะข้อมูลและ pattern การ query ของแอปคุณ
เหมาะกับ MongoDB
- ข้อมูลโครงสร้างไม่แน่นอน หรือเปลี่ยน schema บ่อย เช่น แค็ตตาล็อกสินค้าที่แต่ละหมวดมี field ไม่เหมือนกัน
- แอป Realtime / Chat / IoT ที่เขียนข้อมูลถี่และต้องการ scale แนวนอน (sharding)
- เก็บ JSON document ตรง ๆ จาก API หรือ event log โดยไม่อยากแตกเป็นหลายตาราง
- โปรเจกต์ Node.js / MERN stack ที่ทำงานกับ JSON ทั้ง flow อยู่แล้ว
เหมาะกับ SQL (MySQL / PostgreSQL)
- ข้อมูลมีความสัมพันธ์ซับซ้อนและต้อง JOIN หลายตาราง เช่น ระบบบัญชี, ERP, ระบบจองคิว
- ต้องการ Transaction แบบ ACID ที่เข้มงวด เช่น ระบบการเงิน โอนเงิน ตัดสต็อก
- รายงานเชิงวิเคราะห์ที่ใช้ SQL ซับซ้อน (GROUP BY, window function)
- ทีมคุ้นเคยกับ SQL อยู่แล้ว และไม่ต้องการ scale แนวนอนระดับใหญ่
ในทางปฏิบัติ: หลายระบบใช้ทั้งสองอย่างพร้อมกัน — SQL เก็บข้อมูลธุรกรรมหลัก (ผู้ใช้, ออเดอร์, การเงิน) ส่วน MongoDB เก็บ log, activity feed, หรือ content ที่ schema ยืดหยุ่น บน VPS ตัวเดียวรันได้ทั้งคู่ถ้า RAM พอ
คำสั่ง mongosh พื้นฐานที่ต้องรู้
show dbs— แสดง database ทั้งหมดuse dbname— สลับไปใช้ databaseshow collections— แสดง collectiondb.users.find()— query document ทั้งหมดdb.users.insertOne({...})— เพิ่ม documentdb.users.updateOne({...},{$set:{...}})— แก้ documentdb.users.deleteMany({...})— ลบ document
Checklist หลังติดตั้ง MongoDB
- ติดตั้งจาก official repo (ไม่ใช้ Ubuntu repo) เพื่อได้เวอร์ชันใหม่
- เปิด
authorization: enabledทันที — ห้ามเปิด Production โดยไม่มี Auth - สร้าง user แยกตาม database — ห้ามใช้ admin user ตรง
- ถ้าเปิด Remote ให้ เปิด UFW จำกัด IP เสมอ
- ตั้ง mongodump รายวัน + ส่ง backup ออกนอกเครื่อง
- ตรวจ disk space เป็นระยะ — MongoDB ใช้ disk มากกว่า MySQL
คำถามที่พบบ่อย (FAQ)
MongoDB ต้องใช้ VPS RAM เท่าไหร่ถึงจะพอ?
สำหรับทดสอบหรือเว็บเล็ก ๆ RAM 2GB พอเริ่มได้ แต่ MongoDB ใช้ RAM มากกว่า MySQL เพราะ WiredTiger cache จะพยายามเก็บ working set ไว้ใน memory ถ้าข้อมูลโตหรือมี query พร้อมกันหลายคน แนะนำ RAM 4GB ขึ้นไป และจำกัด cacheSizeGB ใน config เพื่อกันไม่ให้ MongoDB กิน RAM จนบริการอื่นบน VPS ล่ม VPS ของ AsiaGB เริ่มต้น 500 บาท/เดือน บน SSD เลือก RAM ได้ตามต้องการ
MongoDB กับ MySQL ใช้พร้อมกันบน VPS ตัวเดียวได้ไหม?
ได้ และเป็นเรื่องปกติมาก หลายระบบใช้ MySQL เก็บข้อมูลธุรกรรมหลัก ส่วน MongoDB เก็บ log หรือ content ที่ schema ยืดหยุ่น ทั้งสองบริการรันคนละ port (MySQL 3306, MongoDB 27017) ไม่ชนกัน แต่ต้องมั่นใจว่า VPS มี RAM เพียงพอสำหรับทั้งคู่ และตั้ง cacheSizeGB ของ MongoDB ให้เหมาะ ไม่งั้นทั้งสองจะแย่ง RAM กัน
ลืมรหัสผ่าน admin ของ MongoDB ทำอย่างไร?
หยุด mongod แล้วแก้ /etc/mongod.conf ปิด authorization: enabled ชั่วคราว restart เข้า mongosh โดยไม่ต้องใส่รหัส แล้วใช้ db.changeUserPassword("adminUser","NewPassword") ตั้งรหัสใหม่ จากนั้นเปิด authentication กลับและ restart อีกครั้ง ระหว่างที่ปิด auth ชั่วคราว ควรปิด remote access (bindIp กลับเป็น 127.0.0.1) หรือปิด firewall ไว้ก่อน
backup ด้วย mongodump ขณะที่ฐานข้อมูลกำลังใช้งานอยู่ได้ไหม?
ได้ mongodump อ่านข้อมูลแบบ online ไม่ต้องหยุดบริการ แต่สำหรับฐานข้อมูลขนาดใหญ่ที่มีการเขียนตลอด ค่า snapshot อาจไม่ consistent 100% ถ้าต้องการ backup ที่ point-in-time แม่นยำควรใช้ replica set + --oplog หรือทำ filesystem snapshot สำหรับเว็บทั่วไป mongodump รายคืนผ่าน cron แล้วส่งไฟล์ออกนอกเครื่องก็เพียงพอแล้ว
ต้องการ VPS สำหรับ MongoDB ที่เสถียร?
AsiaGB VPS Linux SSD เริ่มต้น 500 บาท/เดือน RAM พอใช้ MongoDB Full Root Access เลือกทำเลไทย / สิงคโปร์
ดูแพ็กเกจ VPS