MongoDB มือใหม่: เริ่มต้นกับ NoSQL ง่ายๆ ด้วย PyMongo
ทำไมต้อง MongoDB? เก็บข้อมูลแบบ JSON นี่แหละมันสุดๆ
เดี๋ยวนี้ใครๆ ก็พูดถึง NoSQL กันใช่มั้ย? หนึ่งในนั้นที่ดังๆ ก็คือ MongoDB นี่แหละ มันไม่ใช่ฐานข้อมูลแบบตารางๆ เหมือนที่เราคุ้นเคยกันอย่าง MySQL หรือ PostgreSQL นะ แต่มันเป็นแบบ Document-Oriented คือเก็บข้อมูลเป็นเอกสาร ซึ่งเอกสารพวกนี้ก็คือ JSON (หรือ BSON) ของเรานี่แหละ ข้อดีคือยืดหยุ่นกว่าเยอะ ไม่ต้องมานั่งคิด Schema เป๊ะๆ ตั้งแต่แรก จะเพิ่ม field ทีหลังก็ง่าย ไม่ต้อง alter table ให้วุ่นวาย
เอาจริงๆ นะ ถ้าโปรเจกต์คุณไม่ได้ต้องการความสัมพันธ์ของข้อมูลที่ซับซ้อนเป็นล้านๆ อย่างพวก ERP หรือบัญชีอะไรพวกนั้น MongoDB คือตัวเลือกที่น่าสนใจเลยล่ะ เหมาะกับพวกแอปพลิเคชันที่ข้อมูลเปลี่ยนแปลงบ่อยๆ หรือข้อมูลหลากหลายรูปแบบ
ติดตั้ง MongoDB (แบบสั้นๆ)
อันนี้ผมขอข้ามรายละเอียดการติดตั้งตัว MongoDB Server ไปนะ เพราะมันมีหลายวิธี ทั้งลงบนเครื่องตรงๆ หรือใช้ Docker ก็ได้ ถ้าใช้ Docker ก็รันประมาณนี้
docker run -d --name my-mongo -p 27017:27017 mongo
ลองเช็ค docker ps ถ้ามี my-mongo ขึ้นมาก็โอเคแล้ว
เริ่มโค้ด PyMongo กันเลย
ก่อนอื่นก็ต้องลง PyMongo ก่อนนะ พิมพ์ไปเลยง่ายๆ
pip install pymongo
ทีนี้มาลองเชื่อมต่อ แล้วเล่น CRUD (Create, Read, Update, Delete) กันดู
1. เชื่อมต่อฐานข้อมูล
อันนี้สำคัญสุด ถ้าเชื่อมต่อไม่ได้ก็ทำอะไรต่อไม่ได้ ถูกมะ? ปกติ MongoDB จะรันที่ localhost:27017 นะ
from pymongo import MongoClient
# เชื่อมต่อกับ MongoDB
# ถ้าไม่ระบุ host/port มันจะ default ที่ localhost:27017
client = MongoClient('mongodb://localhost:27017/')
# เลือก Database ที่จะใช้ ถ้าไม่มีมันจะสร้างให้เลยนะ
db = client.my_new_database
# เลือก Collection (เหมือนตารางใน SQL)
# ถ้าไม่มีมันก็สร้างให้เหมือนกัน
users_collection = db.users
print("เชื่อมต่อ MongoDB สำเร็จ!")
ปัญหาที่เคยเจอ: บางทีเผลอไปรัน mongod ซ้ำซ้อน หรือพอร์ตชนกับโปรแกรมอื่น มันจะ ConnectionRefusedError ขึ้นมาเลย อันนี้ต้องเช็คดีๆ ว่าตัว MongoDB Server รันอยู่รึเปล่า แล้วพอร์ตว่างมั้ย
2. เพิ่มข้อมูล (Create)
การเพิ่มข้อมูลใน MongoDB เราจะเพิ่มเป็นเอกสาร (document) ซึ่งก็คือ Python dictionary ของเรานี่แหละ ใส่ไปกี่ field ก็ได้ มันยืดหยุ่นดี
# เพิ่มข้อมูลเดี่ยวๆ
user_data = {
"name": "สมชาย ใจดี",
"email": "[email protected]",
"age": 30,
"city": "กรุงเทพฯ"
}
result = users_collection.insert_one(user_data)
print(f"เพิ่ม user สมชาย สำเร็จ! ID: {result.inserted_id}")
# เพิ่มข้อมูลหลายๆ อันพร้อมกัน (insert_many)
more_users = [
{"name": "สมหญิง รักบ้าน", "email": "[email protected]", "age": 25, "hobbies": ["reading", "cooking"]},
{"name": "ปีเตอร์ ท่องโลก", "email": "[email protected]", "age": 35, "country": "USA"}
]
results = users_collection.insert_many(more_users)
print(f"เพิ่ม user เพิ่มเติม สำเร็จ! IDs: {results.inserted_ids}")
จะเห็นว่า field hobbies กับ country มันต่างกันนะ แต่ก็ใส่เข้าไปได้เลย ไม่ต้องคิดมาก นี่แหละความยืดหยุ่นของ NoSQL!
3. อ่านข้อมูล (Read)
อ่านข้อมูลนี่มีหลายแบบ ทั้งหาทั้งหมด หรือหาเฉพาะที่ตรงเงื่อนไข
# หาข้อมูลทั้งหมดใน collection
print("\n--- Users ทั้งหมด ---")
for user in users_collection.find():
print(user)
# หาข้อมูลที่ตรงเงื่อนไข (ใครอายุ 25?)
print("\n--- Users ที่อายุ 25 ---")
for user in users_collection.find({"age": 25}):
print(user)
# หาข้อมูลแค่ตัวเดียว (find_one)
print("\n--- หา user ชื่อปีเตอร์ ---")
peter = users_collection.find_one({"name": "ปีเตอร์ ท่องโลก"})
if peter:
print(peter)
else:
print("ไม่พบปีเตอร์")
# หาข้อมูลที่มี field 'city' (แบบเช็คว่ามี field นี้ไหม)
print("\n--- Users ที่มีข้อมูลเมือง ---")
for user in users_collection.find({"city": {"$exists": True}}):
print(user)
4. อัปเดตข้อมูล (Update)
การอัปเดตข้อมูลก็ระบุเงื่อนไข แล้วก็ข้อมูลที่จะอัปเดต
# อัปเดต user สมชาย ให้มีเมืองใหม่ และเพิ่ม field 'status'
# $set ใช้สำหรับกำหนดค่า field
# $inc ใช้สำหรับเพิ่มค่าตัวเลข (ถ้ามี)
users_collection.update_one(
{"name": "สมชาย ใจดี"},
{"$set": {"city": "เชียงใหม่", "status": "active"}}
)
print("\n--- สมชาย อัปเดตแล้ว ---")
print(users_collection.find_one({"name": "สมชาย ใจดี"}))
# อัปเดตหลายๆ user (update_many) เช่น เพิ่มอายุทุกคน 1 ปี
# อันนี้ใช้ $inc เพื่อเพิ่มค่า age
update_result = users_collection.update_many(
{},
{"$inc": {"age": 1}}
)
print(f"\nอัปเดตอายุ user ไป {update_result.modified_count} คนแล้ว!")
5. ลบข้อมูล (Delete)
ลบข้อมูลก็ง่ายๆ คล้ายๆ กับหาข้อมูลนั่นแหละ
# ลบ user ปีเตอร์
delete_result = users_collection.delete_one({"name": "ปีเตอร์ ท่องโลก"})
if delete_result.deleted_count > 0:
print("\nปีเตอร์ ถูกลบออกจากระบบแล้ว.")
else:
print("\nไม่พบปีเตอร์ที่จะลบ.")
# ลบทุก user ที่อายุมากกว่า 30
delete_many_result = users_collection.delete_many({"age": {"$gt": 30}})
print(f"ลบ user ที่อายุมากกว่า 30 ไป {delete_many_result.deleted_count} คนแล้ว.")
# ลบข้อมูลทั้งหมดใน collection (ระวังนะ!)
# users_collection.delete_many({})
# print("ลบข้อมูลทั้งหมดใน collection users แล้ว!")
สรุปส่งท้าย
PyMongo ทำให้การทำงานกับ MongoDB ใน Python มันง่ายจริงๆ นะ โค้ดดูสะอาดตาดีด้วย เหมาะกับโปรเจกต์ที่ข้อมูลไม่ซับซ้อนมาก หรือโปรเจกต์ที่ต้องการความยืดหยุ่นสูงๆ
สำหรับผมนะ ถ้าไม่ได้ต้องการ Acid Transaction ที่เข้มงวดแบบระบบการเงิน หรือไม่ได้มี Join ข้ามตารางแบบโหดๆ MongoDB ก็เป็นตัวเลือกที่ดีมาก มันช่วยให้เรา develop ได้เร็วขึ้นเยอะเลยล่ะ ลองเอาไปปรับใช้ในโปรเจกต์คุณดูนะ
ถ้ามีอะไรผิดพลาดตรงไหน หรืออยากให้เสริมเรื่องไหน บอกมาได้เลยนะ ยินดีเลย!