สอนทำเว็บไซต์ด้วย Node.js, Express และ MongoDB ตอนที่ 6 - เริ่มต้นกับ MongoDB

Chai Phonbopit

Software Engineer & Blogger

17 February 2020

In

สวัสดีครับ มาต่อกันที่ตอนที่ 6 กันนะครับ สำหรับตอนนี้จะเป็นเรื่องเกี่ยวกับ MongoDB แล้วครับ โดยวันนี้จะเป็นเกี่ยวกับ MongoDB และวิธีการใช้งาน MongoDB เบื้องต้น ผ่าน Shell และ GUI นะครับ ยังไม่ได้ลงไปถึงการต่อ หรือการเขียนระหว่าง Nodejs และ MongoDB

เนื้อหาบทเรียน


ก่อนหน้านี้ จริงๆ ผมเคยเขียนบทความเกี่ยวกับ MongoDB ไว้เหมือนกัน สามารถอ่านได้จากด้านล่างก็ได้ครับ โดยในบทความนี้ก็พยายามเขียนจากบทความเดิม แต่มีแก้ไข และอัพเดทให้มันปัจจุบันนะครับ

MongoDB คืออะไร?

MongoDB เป็น Database แบบ NoSQL คือไม่ใช่ว่า ไม่ใช้ SQL นะครับ แต่หมายถึง non SQL หรือ non relational ครับ คือมันอาจจะมีการเก็บ หรือการทำ relation ที่แตกต่างจากพวก Relation Database และจะถูกเก็บข้อมูลเป็น BSON ซึ่งมันก็คล้ายๆกับ JSON เลยครับ โดยเก็บเป็น Key และ Value นอกจากนี้มันก็จะมีตัว _id ที่เป็น auto generate ให้เป็น unique key ครับ

ซึ่งมันก็เป็นหนึ่งในจุดเด่นของ MongoDB เช่นกัน นอกจากนี้ก็มี เรื่อง Schemaless คือการไม่ต้องกำหนดโครงสร้างใดๆให้มันเหมือน SQL ปกติทั่วไป เช่น collection User (หรือ Table User) มีเก็บแค่ name ต่อมาเราสามารถเพิ่มการเก็บ position เข้ามาได้เลย แบบนี้ แต่ถ้าเป็น SQL เราก็ต้องมาปรับ schema ใหม่ (จริงๆเรื่อง schemaless มันก็เป็นได้ทั้งข้อดีข้อเสียเนอะ อยู่ที่การใช้งานของเรา และการออกแบบครับ)

ตัวอย่างเมื่อเปรียบเทียบระหว่าง SQL เช่น MySQL กับ NoSQL อย่าง MongoDB

MySQLMongoDB
TableCollection
RowDocument
ColumnField
JoinsEmbedded documents, linking

เพื่อนๆ สามารถอ่าน MongoDB Guides ได้จาก Official ของ MongoDB ได้เช่นกันครับ

ติดตั้ง MongODB

สำหรับการติดตั้ง MongoDB บน Mac OS นั้นง่ายๆมากครับ เราสามารถติดตั้งผ่าน Homebrew ได้เลยครับ

brew tap mongodb/brew
brew install mongodb-community

ส่วน Windows สามารถ Download ได้จาก Link นี้ครับ แล้วเลือก Version และ OS ที่เราต้องการครับ (แนะนำเป็นเวอร์ชั่น 4.2.3 ซึ่งเป็นเวอร์ชั่นปัจจุบัน)

หรือดาวน์โหลดจาก Link ตรงนี้ได้เลยครับ

ก็ทำการติดตั้ง ผ่าน Installaition Wizard ได้เลยครับ เมื่อติดตั้งเสร็จ เราสามารถ Start MongoDB ได้ด้วยคำสั่ง

# สำหรับ Windows
"C:\Program Files\MongoDB\Server\4.2\bin\mongod.exe"
# สำหรับ Mac
mongod

หากใครไม่สามารถ Start ได้ ให้สร้างโฟลเดอร์ /data/db ขึ้นมาก่อนครับ หรือลองดูบทความด้านล่างประกอบ

คำสั่ง MongoDB เบื้องต้น

เมื่อเรา Start Server ของ MongoDB ได้แล้ว เราสามารถใช้คำสั่ง หรือ shell เข้าไปใน MongoDB Server ได้ด้วยการเปิด Terminal หรือ Power Shell จากนั้นพิมพ์

mongo

จะได้เจอ Message รวมถึง Warning ประมาณนี้

MongoDB shell version v4.2.3
Server has startup warnings:
2020-02-10T13:11:13.117+0700 I CONTROL [initandlisten]
2020-02-10T13:11:13.117+0700 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
...
---
เราสามารถพิมพ์ เพื่อดูคำสั่งของ MongoDB ได้ด้วย (ต้อง shell เข้าไปก่อนนะครับ) ให้พิมพ์ `help`
```bash
> help

การดูรายชื่อฐานข้อมูลทั้งหมดใช้คำสั่ง

> show dbs

จะแสดงรายชื่อฐานข้อมูลในเครื่อง ประมาณนี้

test 0.078GB

เราสามารถเลือกฐานข้อมูลที่ต้องการจากรายชื่อได้ โดยใช้ use <db_name> เช่น

> use test
switched to db test

เราสามารถดู Collections ทั้งหมด ใน table ได้ด้วยคำสั่ง

> show collections

Insert MongoDB

ตัว MongoDB จะเก็บข้อมูล (Document) เป็น BSON เก็บไว้ใน Collection เช่น users ซึ่งการ Insert หากว่า เราไม่ได้ระบุ _id ตัว MongoDB จะทำการใส่ให้อัตโนมัติ โดยเป็นค่าแบบ ObjectId เช่น การใช้ insertOne()

Syntax มันคือ db.COLLECTION_NAME.command เช่น

db.users.insertOne({
"name": "chai",
"blog": "devahoy"
});

นอกจากนี้เรายัง Insert ที่ละหลายๆค่า หรือ insert ด้วย array ได้เช่นกัน ด้วยคำสั่ง insertMany() เช่น

db.users.insertMany([
{ name: 'chai' },
{ name: 'admin' }
]);

Query

การค้นหา หรือ Query จะเป็น syntax db.COLLECTION_NAME.find() ครับ โดยเราสามารถใส่ condition เป็น Object ได้

db.users.find()
# หรือ
db.users.find({})

คือการ Query collection users โดยไม่มี criteria นั่นเอง ก็จะได้ users ทั้งหมด หากเราต้องการ Query แบบ กำหนดเงื่อนไข ก็แค่ระบุเป็น key value เช่น query name ที่มีค่า chai ก็จะเป็น

db.users.find({ name: "chai" });

เราสามารถใช้ .pretty() ต่อท้าย find() เพื่อให้มัน format ให้สวยได้ (เฉพาะใน Mongo Shell) เช่น db.users.find().pretty();

Logical Condition

นอกจากนี้ก็มีการ Query ด้วยการใช้ Logical Condition เช่น AND, OR หรือพวก มากกว่า น้อยกว่าครับ เช่น หากเราต้องการ Query users ที่ชื่อ admin และมี email = [email protected] เราก็จะทำแบบนี้

db.users.find({ $and: [{ "name": "admin" }, { "email": "[email protected]" }]})

การใช้ OR หรือ น้อยกว่าก็เช่นกัน เช่น หา users ที่อายุน้อยกว่า 20

db.users.find({ age: { $lt: 20 }});

Update

การ Update เราสามารถเลือก Update ค่าเดียว หรือทีละหลายๆค่าก็ได้ โดยมี criteria และข้อมูลที่เราต้องการจะอัพเดท โดยใช้ Operator $set มาช่วย ตัวอย่างเช่น ทำการอัพเดท users ที่ชื่อ admin โดยเปลี่ยนเป็น admin2 และ status เป็น deactive

db.users.updateOne(
{ "name": "admin"},
{
$set: { "name" : "admin2", "status" : "deactive" }
}
)

ส่วนการ Update หลายๆค่า ก็ทำเหมือนกันเลย เพียงแค่เปลี่ยนจาก updateOne เป็น updateMany เช่น

db.users.updateMany(
{ "name": "admin"},
{
$set: { "name" : "admin2", "status" : "deactive" }
}
)

สิ่งที่ updateOne ทำคือ หาก condition ตรงตามที่เรากำหนด มันจะอัพเดท ค่าแรกที่เจอ ในขณะที่ updateMany จะอัพเดททุกค่าที่เข้าเงื่อนไข นั่นเอง

Delete

การ Delete หรือลบข้อมูล เราจะใช้ deleteOne และ deleteMmany คล้ายๆกับ Update ครับ คือกำหนด condition / criteria ที่เราต้องการลบ หากเป็น deleteOne มันเจอค่าแรก มันก็จะลบแค่ค่าแรกที่เจอครับ เช่น

db.users.deleteOne({ "status": "deactive" });

หรือ ลบที่ละหลายๆค่า

db.users.deleteMany({ "status": "deactive" });

นอกเหนือจากที่กล่าวมาเบื้องต้น เพื่อนๆยังสามารถไปดูพวก Command คำสั่งต่างๆ ของ MongoDB เพิ่มเติมได้ที่ Official Document ของมันได้เลยครับ MongoDB - Collection Methods

MongoDB GUI

หากใครสงสัยว่า เราจะใช้ GUI ได้มั้ย ไม่อยากใช้ shell คำตอบคือได้ครับ และ GUI ที่เป็นที่นิยมสำหรับ MongoDB ก็คือ Robo 3T หรือชื่อเก่าคือ Robomongo นั่นเอง

MongoDB Screenshot

รูปภาพจากเว็บ Robo 3T

สามารถดาวน์โหลดได้เลยครับ จะเลือกแบบ Studio หรือแบบธรรมดาก็ได้เช่นกัน

โดยตัว Studio มันจะมีขนาดใหญ่กว่า และมันก็มี features อื่นๆ เช่น

  • สามารถ Migrate database จาก sql ได้
  • auto complete เวลาเราพิมพ์ command
  • ลากวางได้ หรือใช้คำสั่ง sql เพื่อ query mongodb ก็ได้ (มันจะแปลงให้)

แต่สำหรับใครชอบแบบเรียบๆ ง่ายๆ ก็เลือกแบบธรรมดาก็ได้ครับ

เราสามารถเลือก connect database และเลือก collection ได้แบบนี้ครับ สามารถ click หรือใช้ query command ก็ได้เช่น ก็คล้ายๆ พวก sql Benchmark / Toad / Data Grip / TablePlus หรือ Tool อื่นๆเลยครับ

Connect Robo 3T

Robo 3T Table


ตอนนี้เราก็สามารถเรียนรู้ MongoDB เบื้องต้น และคำสั่งเบื้องต้นได้แล้วนะครับ ตอนต่อไป เราจะทำการเชื่อมต่อ หรือการ Query / Insert ข้อมูล โดยผ่าน Node.js (Express.js) กันครับ ติดตามอ่านได้เลยครับ

หากใครติดปัญหา หรือไม่เข้าใจตรงไหน สามารถสอบถามได้ครับ หรือหากใครเจอข้อผิดพลาด สามารถแนะนำได้เช่นกันครับ

ขอบคุณครับ

❤️ Happy Coding