ใช้ MongoDB กับ Node-red ฉบับจับมือทำ x DrZin

L Pasawee
Dr-Zin
Published in
8 min readAug 16, 2019

สอนใช้งาน MongoDB Atlas กับ Node-red แบบจับมือทำ มือใหม่ก็ทำตามได้ง่ายๆ

MongoDB คืออะไร

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

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

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

MongoDB Atlas ละคืออะไร

คือ ระบบ MongoDB as a service ที่เป็น การรวมกันของ MongoDB เอง กับ Atlas ที่เป็นผู้ให้ บริการ Cloud ซึ่งข้อดีก็มีอยู่มากมาย คืออ มันง่ายนั่นเอง ไม่ต้องกลัวว่าข้อมูลจะหายด้วยเพราะทุกอย่างเก็บในระบบ Cloud

เริ่มสมัครกันเลย เข้าไปที่ https://www.mongodb.com/

เข้าไปที่ Sign inได้เลย

สำหรับคนที่ยังไม่มีบัญชีให้กดที่ Register เพื่อสมัครได้เลยครับ

เรากดเข้าหน้า Register แล้วเราก็กรอกข้อมูลให้ครบถ้วนตามด้วย

กรอกเสร็จแล้วกด Continue ต่อเลย เราจะเริ่มสร้าง cluster แรกกัน

Cluster คือCloud server ของเราตัวหนึ่ง ที่จะจัดการ Database ให้เรา ในครั้งนี้เราจจะเลือกแบบฟรีด้วย (ของฟรีก็ใช้ไม่หมดละ)

กด Build my first cluster เราจะเจอหน้าตั้งค่าเต็มไปหมดเลย ตั้งค่าตามนี้ได้เลย อย่าลืมตั้งชื่อ cluster ด้วยละ

เช็คให้แน่ใจอีกครั้งว่ามัน Free แล้วกด Create Cluster ได้เลย

mongoDB Atlas มี Guide มาให้ด้วยนะ ทำตาม Guide ได้เหมือนกัน

ทุกอย่างเรียบร้อยเราจะเห็นหน้าตา Cluster เราแบบนี้

สร้าง Database User แรกของเรากัน เพื่อสร้าง User ในการเข้าถึงฐานข้อมูลต่างๆของเรา

คลิ๊กที่ Database Access ในหมวด Security ทางฝั่งซ้ายมือ

เข้ามาแล้วให้คลิ๊กที่ +ADD NEW USER ตั้งค่า Username Password ให้เรียบร้อย เลือก User Privileges เป็น Atlas admin

ตั้งค่า Network Access เพื่อให้ IP ไหนบ้างที่สามารถเข้าถึงฐานข้อมูลของเราได้ เริ่มจากเข้าไปในเมนู Network Access

เข้ามาแล้ว ให้คลิ๊กที่ +ADD IP ADDRESS เพื่อเพิ่ม IP ให้เข้าถึงได้ เลือกเป็น ALLOW ACCESS FROM ANYWHERE จากนั่น กด Confirm เลย

ADD CURRENT IP ADDRESS เพิ่ม IP เครื่องปัจจุบันของเรา ทำให้เครื่องเราเท่านั่นตอนนี้ ที่จะเข้าถึง Database ได้ ( ไม่ควรเลือก เพราะ IP ของเราจะมีการเปลี่ยนทุกครั้งที่เราเชื่อมต่อ Internet ใหม่)

ALLOW ACCESS FROM ANYWHERE เราสามารถเข้าถึง Database จากคอมเครื่องไหนก็ได้ หรือ จาก IP อะไรก็ได้ ( เหมาะสำหรับใช้งานทั่วไปและ คนที่ไม่มี Public IP )

ต่อไปเราลองใส่ข้อมูลเข้าไปใน Database ของเราผ่าน Load Sample Data Set อยู่ใน … ของ หน้า cluster

เรา Load Sample Data Set แล้วเราลองเข้ามาดูข้อมูลที่เรา โหลดเข้ามาบ้าง เข้ามาดูได้ใน collections ของหน้า cluster

เราจะเห็นว่ามีข้อมูลเพิ่มเข้ามาหลากหลายมาก เราสามารถใช้ Data Set ตรงนีร้สำหรับการทดลองใช้ ความสามารถต่างๆของ MongoDB ได้

สำหรับคนไหนที่สนใจจะศึกษาในเชิงลึกขึ้น สามารถเข้าไปดูได้ที่ https://docs.atlas.mongodb.com/

สร้าง collections แรกของเรากัน

เราลอง Load Sample Data Set มาแล้ว ตอนนี้เราลอง มาสร้าง Database ของเราเองกันบ้าง เริ่มด้วยการเข้าไปที่ collection แล้วกด Create Database

collections คล้าย Folder ที่เอาไว้เก็บข้อมูลของเราภายใน Database การเก็บหรือเรียกใช้งานข้อมูลของ mongoDB จะเรียกข้อมูลใน collection เท่านั่น

ใส่ชื่อ DATABASE NAME และ ชื่อ COLLECTIONS NAME เป็นชื่อของ Collections แรกของเรา กรอกข้อมูลครบแล้ว กด Create ได้เลย

เราสร้างเสร็จแล้ว จะได้ Collections เปล่าๆมาหนึ่งอันแบบนี้

เสร็จแล้วตอนนี้เราได้ Collections แรกของเราแล้ว

เชื่อมต่อ Database จาก Node-red

เริ่มต้นด้วยการตั้งค่าการเชื่อมต่อ เข้าไปที่ CONNECT ที่ Cluster เลือกการเชื่อมต่อแบบ Connect Your Application เราจะได้ลิงก์สำหรับเชื่อมต่อมา

เมื่อเรานำไปใช้งาน ให้ copy ลิงก์เพื่อนำไปใช้ต่อไป

<password> ให้แทนที่ด้วย password ที่ตั้งขึ้นใน Database Access

ทำความรู้จักกับ CRUD ของ MongoDB กัน

CRUD ย่อมาจาก create, read, update, and delete เป็น operations ที่ใช้สำหรับการ สร้าง, อ่าน, อัพเดต, ลบ ข้อมูลต่างๆใน Collections ของเราตรงนี้จะเป็น concept ขั้นพื้นฐานในการทำ API หรืออื่นๆที่ต่อการ ฐานข้อมูล

Create

create และ insert เป็น operations ที่จะใช้เพิ่มข้อมูลเข้าไปที่ collections ถ้า collections ที่เราต้องการเพิ่มค่าไม่มีอยู่ จะทำการสร้าง collections ใหม่ให้เลย คำสั่งที่ใช้เพิ่มข้อมูล คือ insertOne, insertMany

โครงสร้าง ของ insertOne มีโครงสร้างแบบนี้ ข้อมูลที่ใส่เข้าไปเป็น Object ของข้อมูลที่เราต้องการใส่

db.users.insertOne(
{
name: "Brazil",
age: 26,
status: "pending"
}
)

Read

Read เป็น operations ที่ใช้อ่านข้อมูลจาก collections โดยเลือกข้อมูลที่ต้องการและแสดงผลออกมา คำสั่งที่ใช้คือ find โดยใส่ quey criteria และ projection เพื่อใช้ในการคนหาและแสดงผลข้อมูลที่ต้องการ

query criteria คือ ข้อมูลที่เราค้นหาใส่เป็น object

projections คือ ข้อมูลผลการค้นหาที่เราจะแสดง 1 คือแสดงผล 0 คือไม่แสดงผล

db.inventory.find( { status: "A" }, { item: 1, status: 1 } )

จากตัวอย่างข้างบน query criteria

{ status: "A" } ค้นหาใน field status ข้อมูลที่เราค้นหาคือ A

projections คือให้แสดงผล ข้อมูลใน item และใน status ได้โค้ดตามข้างล่าง

{ item: 1, status: 1 } 

Update

Update เป็น Operations ที่ใช้ในการเปลี่ยนแปลงข้อมูลใน collections Function ที่ใช้งานมีดังนี้ updateOne, updateMany, replaceOne ในบทความนี้เรายกตัวอย่าง UpdateMany มีโครงสร้างในการใช้งานดังนี้

db.users.updateMany(
{ age: {$lt: 18} },
{ $set: { status: "reject" } }
)

จากโครงสร้างด้านบน ข้อมูลที่จะใส่ใน updateMany มีสองส่วนคือ update filter, update action

update filter คือ object ที่เราจะใช้ในการคนหา

update action คือ object ของข้อมูลที่เราต้องการ update และต้องมี operater ด้วย

operatier คือ คำสั่งเฉพาะที่ใช้ใน mongoDB สามารถเข้าไปดูได้ใน https://docs.mongodb.com/manual/reference/operator/

Delete

Delete เป็น operations ที่ใช้สำหรับการลบข้อมูลใน collections มีคำสั่งที่ใช้ในการลบคือ deleteOne, deleteMany ตัวอย่างในการใช้คือใส่ object ของข้อมูลที่ต้องการ ลบเข้าไปใน Function

db.users.deleteMany(
{ status: "reject" }
)

CRUD เป็น Function พื้นฐานในการใช้ Database ทุกชนิดที่ได้อธิบายไปหากสงสัยสามารถเข้าไปดูข้อมูลเต็มได้ใน

เชื่อมต่อ MongoDB Atlas กับ Node-red

สำหรับใครที่ยังไม่รู้จัก node-red มาก่อนสามารถเข้าไปอ่านได้ที่

พิมพ์คำสั่งดังนี้ลงใน CMD เพื่อ Start Node-red server ได้เลย

node-red

เราจะเห็นคำสั่งรันแบบนี้แสดงว่า Node-red เราเริ่มทำงานแล้ว

พิมพ์ address ข้างล่างลงใน browser เพื่อเริ่มใช้งาน node-red

http://locallhost:1880/

เราจะเห็นหน้าตา node-red แบบนี้ขึ้นมาใน browserเรา

ต่อไปคือการติดตั้ง node mongoDB-3 เป็น node ไว้ใช้สำหรับเชื่อมต่อ mongoDB Atlas เข้าไปที่ manage palette

ค้นหา mongodb ใน Tabs search เจอแล้ว กด install เพื่อเริ่มติดตั้งได้เลย

เมื่อเรา install เสร็จแล้วเราจะได้ node เพิ่มขึ้นมา คือ mongodb3

เราเริ่มติดตั้งทุกอย่างพร้อมแล้ว เรามาเริ่มทำ CRUD กันเริ่มต้นด้วย

Create เพิ่มข้อมูลลง collections ผ่าน node-red

node ที่เราจะใช้ มีสองอันคือ inject และ mongodb3 เริ่มด้วยการลากทั้งสอง node ลงมาบน flow ของเราก่อนแบบนี้

ต่อไปเรามาตั้งค่าให้ inject ส่งข้อมูลออกมาเป็น JSON กันตั้งค่าตามนี้ได้เลย ข้อมูลที่เราจะใช้จำลองในคือ

{
"title":"test1",
"duration":10,
"status":"Todo"
}

เราตั้งค่า inject กันเสร็จแล้ว ตั้งค่า mongodb3 กันต่อเลย

เลือก Service เป็น External service Server กดที่รูปดินสอแล้วเข้าไปตั้งค่ากันเลย

URI ได้มาจาก connections ของ mongoDB

Name ชื่อของ Server

Username ใส่ Username ที่เราตั้งไว้ใน Database Accessหรือไม่ใส่ก็ได้

Password ใส่ Password ที่เราตั้งไว้ใน Database Accessหรือไม่ใส่ก็ได้

Connection Options ให้ใส่ { “useNewUrlParser”: true}

Parallelism Limit เป็น -1 เหมือนเดิม

Copy Link จาก Tabs Connection String Only และ แทนที่ <password> เป็น Password ที่เราสร้างใน Database Access และเปลี่ยน ตรง Test เป็นชื่อ ของ Database ที่เราสร้างขึ้น ในบทความนี้คือ TrainHCRL URI ท้ายที่สุดเราจะได้แบบนี้

mongodb+srv://DrZin:<password>@trainhcrl-stisr.mongodb.net/TrainHCRL?retryWrites=true&w=majority

ตั้งค่าเสร็จจจะได้แบบนี้ เลือก Server เป็น ชื่อที่เราตั้งไว้ และ collections ในบทความนี้เป็น Test

ให้เอา debug มาต่อที่ท้ายของ node mongodb3 แบบนี้

เลือก Operations เป็น

เรากดที่ ปุ่มสีฟ้า ที่ inject ได้เลย เพื่อเพิ่มข้อมูล ผลลัพธ์ที่ออกมาใน Tabs debug เป็นแบบนี้

แล้วเรามาดูที่ collections ใน MongoDB Atlas ว่ามีข้อมูลเพิ่มเข้ามาแล้ว

Read อ่านข้อมูลจาก Collections กัน

เราเปลี่ยน Operations ของ mongodb3 เป็น findOne

กดที่ inject ได้เลยเราจะเห็นผลลัพธ์ได้ที่ debug แบบนี้ ข้อมูลที่แสดงมาตรงนี้จะตรงกับที่เก็บใน Collections

Update ข้อมูลใน Collections ด้วย updateOne

UpdateOne ต้องใช้ parameter 2 ส่วนคือ update filter และ update action

update filter เราจะ update ข้อมูลที่มี field title ว่า test1

update duration เราจะ เปลี่ยน status เป็น doing จึงต้องใช้ Operator เป็น $set สำหรับการเปลี่ยนแปลงค่าใดๆ

ที่สำคัญเฉพาะใน node-red เราจะส่ง update filter และ update duration ในรูปแบบของ Array ดังตัวอย่างข้างล่าง

[
{
"title":"test1"
},
{
$set:{
"duration":5
}
}]

ใน Flow ของ node-red เราจะใช้ Flow ที่เรียกว่า Function เพิ่มเข้ามาด้วย เพื่อส่ง Array แบบข้างบนไปที่ mongodb และจะ set inject ให้เป็น timestamp เมื่อเรากดใช้งาน inject มันจะไปทำให้ Function ทำงานและส่ง Array ไปให้ node mongodb3

ตั้งค่า inject และ Function ดังนี้

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

และเราสามารถไปดูใน MongoDB Atlas ได้ว่าข้อมูลมีการเปลี่ยนแปลงจริงจาก duration 10 เป็น 5

Delete ข้อมูลใน Collections ด้วย DeleteOne

ในการ delete ข้อมูลใน collections ใช้คำสั่ง deleteOne เพื่อลบ Field ข้อมูล 1 Field ลบด้วยการใส่ object ของ filter ที่เราต้องการลบนบทความนี้ เราจะลบ Field ที่มี title ว่า test1 ทำให้ object ของข้อมูลที่จะลบเป็นแบบนี้

{
"title":"test1"
}

เราจะได้ Function ใน node แบบนี้

เมื่อเรากด ที่ inject และลบสำเร็จเราจะเห็นข้อความใน debug แบบนี้

และใน collections ของ MongoDB Atlas เราจะเห็นได้ว่า ข้อมูลที่มีชื่อ test1 ได้หายไปแล้ว

จบกันแล้วนะครับสำหรับ node-red กับ mongoDB Atlas แบบเบื้องต้น

--

--