เริ่มต้นใช้งาน MongoDB

By KDBEER | Last updated Apr 21, 2021
เริ่มต้นใช้งาน-MongoDB-60789fb47ac0a4cd230caf2e

Table Of Contents

  • ทำไมฐานข้อมูลถึงสำคัญ ?
  • ความแตกต่างระหว่าง SQL และ NoSQL
  • โครงสร้างของ mongodb
  • ทำไมต้องใช้ MongoDB ?
  • การติดตั้ง MongoDB
  • การใช้งาน MongoDB เบื้องต้น
  • สรุป
  • Reference

ทำไมฐานข้อมูลถึงสำคัญ ?

การพัฒนาระบบ IT ในปัจจุบัน ไม่ว่าจะเป็น Software หรือ Application ก็ตาม โดยส่วนมากแล้วนั้น มักจะต้องการระบบฐานข้อมูล (Database) เพื่อเก็บข้อมูล เช่นข้อมูลของลูกค้า ข้อมูลพนักงาน ข้อมูลการขายและรายละเอียดการขายต่างๆ สิ่งเหล่านี้ต้องใช้ฐานข้อมูลทั้งสิ้น

ปัจจุบัน ผู้คนส่วนใหญ่ต่างก็มีโทรศัพท์สมาร์ตโฟน (Smartphone) และเข้าถึงอินเทอร์เน็ตได้มากขึ้น บรรดาธุรกิจและบริการทั้งหลาย ไม่ว่าจะเป็นผู้เล่นเก่าหรือใหม่ ต่างก็ต้องดิ้นรนปรับตัวให้ทันกับพฤติกรรมของผู้บริโภคที่เปลี่ยนแปลงแบบรวดเร็ว การจะกำหนดทิศทางของการเปลี่ยนแปลงองค์กรให้เป็นรูปธรรม ล้วนแต่ต้องใช้ข้อมูลที่เก็บสะสมไว้มาวิเคราะห์ จนตกตะกอนออกมาข้อมูลเชิงลึก (Insight) และนำไปพัฒนาเป็นกฎหรือรูปแบบของการนำไปใช้พัฒนาองค์กรต่อไป

ความแตกต่างระหว่าง SQL และ NoSQL

MongoDB vs SQL terms and concepts
รูปที่ 1 Concept ของ sql และ mongodb

การพัฒนาระบบฐานข้อมูลในปัจจุบัน เรามักจะได้ยินคำว่า SQL (Structured Query Language) และ NoSQL (not only SQL) ซึ่งทั้งสองก็มีประวัติศาสตร์ที่ยาวนาน และก็มองการเก็บข้อมูลคนละแบบกัน ซึ่งถ้าอยากจะเป็นนักพัฒนาซอฟต์แวร์ที่ดี ก็ควรจะรู้จักและฝึกให้ชำนาญทั้งสองแบบครับ ซึ่งความแตกต่างของ SQL และ NoSQL เราสามารถแบ่งออกได้ ดังต่อไปนี้ครับ 

  1. SQL สนใจความสัมพันธ์ (relational) ของข้อมูล , NoSQL เก็บยังไงก็ได้ในรูปแบบของ json และไม่สนใจความสัมพันธ์ (non-relational)
  2. SQL ต้องกำหนดโครงสร้างของข้อมูลหรือนิยามของข้อมูล (Schema) ที่ชัดเจน, NoSQL ไม่สนใจโครงสร้างข้อมูล สามารถปรับเปลี่ยนได้ง่ายกว่า
  3. SQL จะสเกลโดยเน้นเพิ่มสเปกเครื่อง (Scale UP) แต่NoSQL จะเน้นเพิ่มเครื่องแทน (Scale Out)
  4. SQL มองข้อมูลเป็น Table ส่วน SQL มองข้อมูลเป็น document
  5. SQL เหมาะสำหรับการเก็บข้อมูล transactions NoSQL เน้นเก็บข้อมูลแบบ document หรือ json

โครงสร้างของ mongodb

mongodb เก็บข้อมูลในรูปแบบของ document ครับ หรือจะให้เจาะจงไปอีกก็คือ BSON (Binary JSON) ที่ต้องใช้เป็น bson แทนที่จะเป็น json เนื่องจากตัว bson มันสามารถเก็บประเภทของข้อมูล (Data Type) ในรูปแบบของข้อมูลที่ encode ให้เป็น binary ซึ่งมีขนาดเล็ก และเวลาที mongodb นำข้อมูลที่เป็น binary ไปใช้งาน ไม่ต้องเสีย overhead ในการแปลงข้อมูลมากมายนัก และที่สำคัญอีกจุดหนึ่ง คือ bson สามารถเก็บข้อมูลที่ json ไม่ support เช่น ข้อมูลแบบ binary หรือ Date เป็นต้น แต่ bson เองก็มีข้อจำกัด ซึ่งเวลาเอาไปใช้งานต้องระวัง คือ bson สามารถเก็บข้อมูลได้สูงสุด 16 MB ครับ

mongodb เก็บข้อมูลหลายๆ document ไว้ด้วยกัน เราเรียกว่า collection และหลายๆ collection รวมกันเรียกว่า database ดังที่แสดงความสัมพันธ์ในรูปที่ 1 ครับ

แล้วทำไมต้องใช้ MongoDB ?

  • เป็น open source และใช้งานได้ฟรี
  • มีความยืดหยุ่นในการเก็บข้อมูลและแก้ไข แต่การค้นหาข้อมูลทั่วไปก็ทำได้เร็วมากเช่นกัน คุณสามารถเพิ่ม column เข้ามาใหม่ โดยที่มันจะไม่กระทบกับโครงสร้างข้อมูลเดิม
  • การ scale out ของ mongodb จะช่วยลด workload (หลายๆ เครื่องแบ่งกันทำงาน) และสามารถเพิ่มหรือลด node ได้ตามความหนาแน่นของ trafic เลย

การติดตั้ง MongoDB

MongoDB สามารถทำงานได้แทบจะทุก OS เลย และผมได้เขียนวิธีติดตั้ง MongoDB แยกไว้แล้ว สามารถไปดูได้ที่ลิงก์ด้านล่างนี้เลยครับ

การติดตั้งและจัดการสิทธิ์ใน MongoDB

การใช้งาน MongoDB เบื้องต้น

หวังว่าทุกท่านจะสามารถลง mongodb ได้อย่างไม่มีปัญหานะครับ ต่อไปผมจะแนะนำการใช้งาน mongodb เบื้องต้น เพื่อพัฒนาแอปพลิเคชันที่เป็นลักษณะของ CRUD (create, read, update and delete) ซึ่งเป็นโจทย์ทั่วไป ของคนที่จะใช้ฐานข้อมูลต้องเจอ

1. การสร้าง database ใน mongodb

แน่นอนว่าการใช้งานฐานข้อมูลได้ เราก็ต้องสร้างฐานข้อมูลขึ้นมาก่อนครับ  การสร้างฐานข้อมูลใน mongodb เราสามารถทำได้ดังนี้ครับ

use DATABASE_NAME

ก็คือการสร้างคำสั่ง use แล้วตามด้วยชื่อ database ที่เราอยากจะสร้าง เช่นต่อไปนี้ ผมจะสร้างฐานข้อมูลที่ชื่อว่า coins เอาไว้เก็บข้อมูลเหรียญ cryptpcurrency ที่กำลังเป็นที่นิยมในขณะที่ผมเขียนบทความนี้ครับ

use coins

เท่านี้ database ที่เราอยากจะสร้าง ก็จะถูกสร้างขึ้นมาแล้วครับ เราสามารถใช้คำสั่ง show dbs ครับ

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

จะเห็นได้ว่า database ที่เราอยากจะสร้างยังไม่แสดงในลิสต์ ที่เป็นเช่นนั้น เพราะว่าเรายังไม่ได้ใส่ข้อมูลเข้าไปใน database ครับ แต่การจะ insert ข้อมูล ซึ่งต่อไปผมจะขอเรียกว่า document สามารถทำได้ดังนี้ครับ

2. การนำเข้า (Insert) ข้อมูลใน MongoDB

ก่อนอื่นก็ขอให้มั่นใจว่า เรา connect ไปยัง mongodb และเราได้ switch ไปยัง database ที่เราอยากจะสร้างแล้วเรียบร้อย

# เชื่อมต่อกับ mongodb
mongo

# switch database
switch coins

ใช้คำสั่ง db.insert เพื่อ insert ข้อมูล

db.COLLECTION_NAME.insert(document)
ตัวอย่างที่ 1 การ insert ข้อมูล

>db.coins.insert({ name: "Bitcoin", symbol: "BTC" });
WriteResult({ "nInserted" : 1 })

นอกจากนี้ เรายังสามารถ insert ข้อมูลที่เป็น array ได้ด้วยครับ 

ตัวอย่างที่ 2 การ insert ข้อมูลแบบ Array

> db.coins.insert([
...   { name: "Etherium", symbol: "ETH" },
...   { name: "Dogecoin", symbol: "DOGE" },
... ]);
BulkWriteResult({
	"writeErrors" : [ ],
	"writeConcernErrors" : [ ],
	"nInserted" : 2,
	"nUpserted" : 0,
	"nMatched" : 0,
	"nModified" : 0,
	"nRemoved" : 0,
	"upserted" : [ ]
})

เท่านี้ข้อมูลของเราก็จะถูก insert แล้วครับ และแน่นอนว่า database เองก็ถูกสร้างขึ้นมาด้วยเช่นกัน ลองใช้คำสั่ง show dbs อีกครั้ง เพื่อตรวจสอบว่า database ถูกสร้างจริงๆ หรือเปล่า

> show dbs
admin   0.000GB
coins   0.000GB # ฐานข้อมูลที่ต้องการสร้าง
config  0.000GB
local   0.000GB

จะเห็นว่า database ที่ชื่อ coins ถูกสร้างขึ้นมาอย่างที่เราอยากให้เป็นแล้วครับ 

3. การสืนค้น (Query) ข้อมูลใน MongoDB

db.collection.find(query, projection)

จาก syntax อธิบายได้ดังนี้ครับ

  • query คือ ส่วนของการ filter ว่าเราต้องการที่จะค้นหาข้อมูลอะไร
  • projection คือ ในกรณีที่ document มี field มากเกินไป เราสามารถระบุได้ ว่าจะแสดง field ไหนบ้าง

หลังจากที่เราได้ insert ข้อมูลลงไปแล้ว เวลาเราจะดูว่าใน database เราเก็บอะไรอยู่บ้าง สามารถทำได้ดังนี้ครับ

> db.coins.find()
{ "_id" : ObjectId("607f0a7732a6a11071ac8f69"), "name" : "Bitcoin", "symbol" : "BTC" }
{ "_id" : ObjectId("607f0aa032a6a11071ac8f6a"), "name" : "Etherium", "symbol" : "ETH" }
{ "_id" : ObjectId("607f0aa032a6a11071ac8f6b"), "name" : "Dogecoin", "symbol" : "DOGE" }

หรือถ้าอยากระบุเงื่อนไขให้ชัดเจนมากกว่านี้ สามารถระบุเป็น paremeter ลงไปได้เลย สามารถทำได้ดังนี้ครับ

> db.coins.find({ name: "Bitcoin" });
{ "_id" : ObjectId("607f0a7732a6a11071ac8f69"), "name" : "Bitcoin", "symbol" : "BTC" }

และยังพลิกแพลงเงื่อนไขได้ตามต้องการ ถ้าต้องการอ่านเพิ่มเติม ก็คลิกที่ลิงก์ด้านล่างนี้ได้เลยครับเลยครับ

เรียนรู้เพิ่มเติมเกี่ยวกับ db.collection.find()

4. การแก้ไข (Update) ข้อมูลใน MongoDB

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

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>
   }
)

จาก syntax อธิบายได้ดังนี้ครับ

  • query คือ ส่วนของการ filter ว่าเราต้องการที่จะอัปเดตข้อมูลอะไร
  • update คือ ส่วนที่เราต้องการจะบอกว่าเราจะอัพเดตฟิลด์ไหน อย่างไร
  • upsert คือ ถ้าฟิลด์นี้เป็น true ในกรณีที่เราพยายามจะอัปเดต แต่ว่า ใน collection ค้นหาข้อมูลไม่เจอ mongodb มันจะ insert ให้ครับ
  • multi คือ ถ้าฟิลด์นี้เป็น true เวลามันอัปเดต มันจะอัปเดตทุก documents ที่เข้าเงื่อนไขครับ

เราลองมาดูตัวอย่างการอัปเดตกันครับ 

ตัวอย่างที่ 1 อัปเดตเหรียญ BTS โดยเพิ่มฟิลด์ price เข้าไป

> db.coins.update(
...   { symbol: "BTC" },
...   {
...     $set: {
...       price: 55748,
...     },
...   }
... );

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
ตัวอย่างที่ 2 อัปเดตแบบทุกเหรียญให้มี status เป็น active

> db.coins.update(
...   {},
...   {
...     $set: {
...       active: "active",
...     },
...   },
...   { multi: true }
... );
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })
ตัวอย่างที่ 2 อัปเดตรายการที่ไม่มีฐานข้อมูล และเราจะให้มัน insert เข้าไปครับ

> db.coins.update(
...   { symbol: "ADA" },
...   {
...     $set: { name: "Cardano", symbol: "ADA", price: 55748, active: true },
...   },
...   { upsert: true }
... );
WriteResult({
	"nMatched" : 0,
	"nUpserted" : 1,
	"nModified" : 0,
	"_id" : ObjectId("607f1412244c4dc928da7d82")
})

5. การลบ (Delete) ข้อมูลใน MongoDB

การลบข้อ documents ใน mongodb สามารถทำได้ดังนี้ครับ

db.collection.remove(
   <query>
)

จาก syntax อธิบายได้ดังนี้ครับ

  • query คือ ส่วนของการ filter ว่าเราต้องการที่จะลบข้อมูลอะไร

ตัวอย่างการลบข้อมูลครับ

ตัวอย่างที่ 1 ลบเหรียญ bitcoin ออกจากฐานข้อมูล

> db.coins.remove({ symbol: "BTC" });
WriteResult({ "nRemoved" : 1 })

แต่การลบต้องระวังดีๆ ถ้าไม่ระบุเงื่อนไขที่จะลบ กลายเป็นว่าจะลบข้อมูลทั้งหมดไป

ตัวอย่างที่ 2 ลบเหรียญทั้งหมด

> db.coins.remove({});
WriteResult({ "nRemoved" : 3 })

สรุป

บทความนี้ ผมได้อธิบายความสำคัญว่าทำไมการพัฒนาแอปพลิเคชันในยุคปัจจุบันถึงจำเป็นต้องมีการเก็บข้อมูล และความสำคัญของฐานข้อมูล จากนั้นผมได้นำเสนอฐานข้อมูลที่ชื่อว่า MongoDB และได้อธิบายวิธีการติดตั้ง และนำเสนอการใช้งาน MongoDB เบื้องต้นครับ หวังว่าบทความนี้ จะเป็นประโยชน์ต่อผู้อ่านนะครับ ขอบคุณที่แวะเข้ามาอ่านครับ

Reference

  1. SQL and NoSQL 
  2. https://docs.mongodb.com/manual/reference
  3. https://docs.mongodb.com/manual/core/databases-and-collections/
  4. https://docs.mongodb.com/manual/reference/bson-types/