Devahoy Logo
PublishedAt

Web Development

MongoDB คืออะไร? + สอนวิธีใช้งานเบื้องต้น

MongoDB คืออะไร? + สอนวิธีใช้งานเบื้องต้น

กระแส MEAN Stack มาแรงมากช่วงนี้ จะไม่เขียนก็ไม่ได้ ฉะนั้นบทความนี้จะพาไปรู้จักตัว M หนึ่งใน 4 ของ MEAN Stack นั่นก็คือ MongoDB กันครับ ว่ามันคืออะไร มีประโยชน์อย่างไร และใช้งานเบื้องต้นยังไงกันดีกว่า

สำหรับใครที่กำลังหัดเขียน Node.js และ MongoDB สามารถติดตามอ่านบทความซีรีย์ สอนทำเว็บไซต์ด้วย Node.js, Express และ MongoDB - ตอนที่ 6 - MongoDB ซึ่งผมนำบทความที่เคยเขียน ไปใส่เป็นส่วนหนึ่งในซีรีย์นี้ครับ

Table of Contents

Step 1 : MongoDB คืออะไร ?

MongoDB เป็น open-source document database โดยเป็นฐานข้อมูลแบบ NoSQL คือไม่มี relation (ความสัมพันธ์) ของตารางแบบ SQL ทั่วๆไป แต่จะเก็บข้อมูลเป็นแบบ JSON (JavaScript Object Notation) แทน การบันทึกข้อมูลทุกๆ record ใน MongoDB เราจะเรียกมันว่า Document ซึ่งจะเก็บค่าเป็น key และ value จะเห็นว่ามันก็คือ JSON นั่นแหละ ตัวอย่างเช่น

Terminal window
{
"_id": ObjectId("554b8ee746e04bc5503aef47"),
"name": "Chai"
}

และการเก็บข้อมูล document ใน MongoDB จะถูกเก็บไว้ใน Collections (เปรียบเทียบได้กับ Table ใน Relational Database ทั่วๆไป) แต่แตกต่างกันที่ collection ไม่จำเป็นที่จะต้องมี schema เหมือนกันก็สามารถบันทึกข้อมูลได้

ใน MongoDB ข้อมูล document ที่เก็บใน collection จะมีคีย์ _id ทำหน้าที่เปรียบเสมือน primary key อยู่ด้วย

Schemaless

Schemaless คือการไม่ต้องกำหนดโครงสร้างใดๆให้มันเหมือน SQL ปกติทั่วไป เช่น collection User มีเก็บแค่ name ต่อมาเราสามารถเพิ่มการเก็บ position เข้ามาได้เลย แบบนี้

Terminal window
{ "name": "Chai" }
{ "name": "Chai", "position": "Developer" }

MongoDB ไม่รองรับการ join หรือ SQL

เปรียบเทียบ MongoDB และ MySQL คร่าวๆ ดังนี้

MySQL MongoDB
Table Collection
Row Document
Column Field
Joins Embedded documents, linking

Step 2 : ดาวน์โหลดและติดตั้ง MongoDB

เข้าหน้า Download ของ MongoDB จากนั้นเลือก OS ที่ใช้ วิธีการติดตั้งก็จะแตกต่างกันในแต่ละ OS

MongoDB เวอร์ชั่นล่าสุด ไม่รองรับ Windows XP

สำหรับเครื่องผมก็ติดตั้งผ่าน Homebrew บน Mac OS X ง่ายๆดังนี้

1
brew install mongodb

เมื่อติดตั้งเสร็จเรียบร้อยแล้ว ก็ทำการทดสอบว่ารัน MongoDB ได้มั้ย วิธีการรันก็คือ

1
mongod

ถ้าเป็น Windows ก็จะเป็น

1
mongod.exe

หากไม่สามารถรันได้ ให้ทำการสร้างโฟลเดอร์ /data/db ด้วย mkdir -p /data/db

Step 3 : คำสั่ง และ Mongo Shell เบื้องต้น

หลักจากติดตั้ง และสั่ง start MongoDB server แล้ว การเข้าสู่ Mongo Shell ทำได้โดยการพิมพ์บน Terminal ด้วยคำสั่ง

1
mongo
2
MongoDB shell version: 3.0.4
3
connecting to: test
4
>

หากไม่รู้ว่ามีคำสั่งอะไรบ้างที่สามารถใช้ได้ใน Mongo Shell ให้พิมพ์

Terminal window
> help

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

1
> show dbs

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

1
autobot 0.078GB
2
exebox-dev 0.078GB
3
local 0.078GB
4
mean-dev 0.078GB
5
test 0.078GB

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

1
> use test
2
3
switched to db test

ใช้คำสั่งเพื่อดูว่าฐานข้อมูลนี้มี collection อะไรบ้าง ด้วย

1
> show collections

Insert

ใน Mongo Shell สามารถเซฟ collection ได้ง่ายๆด้วย db.collectionName.save() เช่น

1
// db : standard keyword.
2
// things : collection
3
db.things.save({a: 1, b: 2, c: 3})
4
5
WriteResult({ "nInserted" : 1 })

ด้านบนเป็นการเซฟข้อมูลลง collection ชื่อว่า things

อีกตัวอย่าง เช่น เซฟลง collection ชื่อ players เช่น

1
> db.players.save([
2
{ name: 'Lionel Messi' },
3
{ name: 'Cristiano Ronaldo' }
4
]);
5
6
7
BulkWriteResult({
8
"writeErrors" : [ ],
9
"writeConcernErrors" : [ ],
10
"nInserted" : 2,
11
"nUpserted" : 0,
12
"nMatched" : 0,
13
"nModified" : 0,
14
"nRemoved" : 0,
15
"upserted" : [ ]
16
})

Query

การค้นหาข้อมูล ใน Mongo Shell จะใช้คำสั่ง db.collectionName.find() ตัวอย่างเช่น

1
> db.things.find()

จากตัวอย่าง เราได้ทำการเพิ่มข้อมูลลงไปใน collection players ฉะนั้นลอง find() จะได้ผลลัพธ์ดังนี้

1
> db.players.find()
2
3
{ "_id" : ObjectId("55cf69a0bda97b92d65ea9de"), "name" : "Lionel Messi" }
4
{ "_id" : ObjectId("55cf69a0bda97b92d65ea9df"), "name" : "Cristiano Ronaldo" }

การค้นหาโดยกำหนดเงื่อนไข เช่น ค้นหา collection ที่มี name เท่ากับ Lionel Messi

1
db.players.find({name: 'Cristiano Ronaldo'})
2
3
{ "_id" : ObjectId("55cf69a0bda97b92d65ea9df"), "name" : "Cristiano Ronaldo" }

เราสามารถใช้ pretty() เพื่อแสดง result ให้สวยงามได้ เช่น db.players.find().pretty()

Update

การ Update ข้อมูล เราจะใช้ $set operator ดังเช่น

1
> db.players.update(
2
{'name': 'Lionel Messi'},
3
{
4
$set: {'age': 28}
5
}
6
)
7
8
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

จากโค๊ดด้านบน MongoDB จะทำการ query หา collection players ที่มี name เท่ากับ Lionel Messi จากนั้นก็ทำการ update โดยเพิ่ม age ให้มีค่า 28 ผลลัพธ์เมื่อลอง query ใหม่ จะได้เป็น

Terminal window
> db.players.find()
{ "_id" : ObjectId("55cf69a0bda97b92d65ea9de"), "name" : "Lionel Messi", "age": 28 }
{ "_id" : ObjectId("55cf69a0bda97b92d65ea9df"), "name" : "Cristiano Ronaldo" }

Remove

การลบข้อมูลใน MongoDB จะใช้ remove() เช่น ลบข้อมูลที่ name ชื่อว่า Lionel Messi

Terminal window
> db.players.remove({name: 'Lionel Messi'});
WriteResult({ "nRemoved" : 1 })

หรือหากต้องการกำหนดว่าให้ลบแค่ 1 record ก็ได้ ด้วย flag justOne เช่น

Terminal window
> db.players.remove({name: 'SomeName'}, {justOne: true})
WriteResult({ "nRemoved" : 1 })

Step 4 : Mongo GUI ด้วย Robomongo

หลายๆคนอาจจะสงสัยว่า นอกจากดูผ่าน Mongo Shell แล้วมีวิธีดูแบบง่ายๆผ่าน GUI บ้างมั้ย? คำตอบคือมีครับ และที่นิยมและน่าจะดีที่สุดสำหรับผม ก็คือ RoboMongo

  • สามารถดาวน์โหลดและติดตั้ง Robomongo ได้ที่นี่ มีทุก Platform (เวอร์ชั่นล่าสุดคือ 0.8.5)

Robomongo

จุดเด่นของ Robomongo คือ

  • ใช้คำสั่งได้เหมือนกับ Mongo Shell ทุกประการ
  • สามารถเปิดได้หลายๆ Shell
  • รองรับ Autocompletion เผื่อเวลาลืมคำสั่งก็จะมี guide ให้
  • ดูข้อมูล Result ได้หลากหลายแบบ
  • ดูข้อมูลรายละเอียด collections ได้ง่าย

สรุป

ในบทความนี้ เราก็จะได้รู้จักกับ MongoDB เบื้องต้น ขั้นตอนการติดตั้ง การใช้งาน Mongo Shell และคำสั่งเบื้องต้นของ MongoDB แต่ว่ายังมีอะไรให้เล่นและใ้ห้ศึกษาไ้ด้อีกเยอะเลย หวังว่าบทความนี้จะเป็นพื้นฐานให้ผู้อ่านได้นำไปต่อยอดและมีประโยชน์กับผู้เร่ิมต้น ทุกคนนะครับ :) ลิงค์ไปต่อสำหรับผู้ที่สนใจเพิ่มเติม

Authors
avatar

Chai Phonbopit

เป็น Web Dev ในบริษัทแห่งหนึ่ง ทำงานมา 10 ปีกว่าๆ ด้วยภาษาและเทคโนโลยี เช่น JavaScript, Node.js, React, Vue และปัจจุบันกำลังสนใจในเรื่องของ Blockchain และ Crypto กำลังหัดเรียนภาษา Rust

Related Posts