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 ได้เร็วขึ้นเยอะเลยล่ะ ลองเอาไปปรับใช้ในโปรเจกต์คุณดูนะ

ถ้ามีอะไรผิดพลาดตรงไหน หรืออยากให้เสริมเรื่องไหน บอกมาได้เลยนะ ยินดีเลย!

Read more

PPV คืออะไร? เจาะลึกปรากฏการณ์ Pay-Per-View กับอีเวนต์สุดพิเศษแห่งยุค

PPV คืออะไร? เจาะลึกปรากฏการณ์ Pay-Per-View กับอีเวนต์สุดพิเศษแห่งยุค

ทำความเข้าใจ Pay-Per-View (PPV) กับเทรนด์การรับชมอีเวนต์สุดพิเศษ ทั้งศึก ONE Championship, คอนเสิร์ต Project Sekai และความบันเทิงหลากหลายผ่าน ABEMA PPV.

By ทีมงาน devdog
Xiaomi 17T เผยโฉมภาพจริงจาก Anatel ลุ้นเปิดตัว พ.ค. นี้ พร้อมดีไซน์ใหม่และชาร์จไว 67W!

Xiaomi 17T เผยโฉมภาพจริงจาก Anatel ลุ้นเปิดตัว พ.ค. นี้ พร้อมดีไซน์ใหม่และชาร์จไว 67W!

พบภาพจริง Xiaomi 17T จาก Anatel เผยดีไซน์ใหม่ กล้อง Leica ชิป Dimensity 8500 แบต 6500mAh และชาร์จไว 67W ลุ้นเปิดตัวเดือนพฤษภาคมนี้!

By ทีมงาน devdog
เอลนีโญกลับมาแล้ว! WMO เตือนรุนแรงทั่วโลก ไทยต้องเตรียมรับมือวิกฤตความร้อน

เอลนีโญกลับมาแล้ว! WMO เตือนรุนแรงทั่วโลก ไทยต้องเตรียมรับมือวิกฤตความร้อน

องค์การอุตุนิยมวิทยาโลกเตือนปรากฏการณ์เอลนีโญรุนแรงในปี 2026 อาจทำโลกเผชิญปีที่ร้อนที่สุด. เรียนรู้ผลกระทบและการเตรียมพร้อมของไทย.

By ทีมงาน devdog