Everything Jingle Bell แบบครอบจักวาล MongoDB [ตอนที่ 1: CRUD ]

บทความนี้ผมจะมาอธิบาย  MongoDB และเปรียบเทียบให้เห็นการทำงานระหว่าง SQL ที่ทุกคนรู้จักกันดีผมเชื่อว่าทุกคนทำงานมาต้องผ่านมาแล้วไม่มากก็น้อย ตอนแรกผมคิดว่าจะเขียนรวดเดียวจบเลย แต่คิดว่าคงไม่ไหว เพราะเนื้อเรื่องที่ผมจะเขียนมีดังต่อไปนี้

  • เปรียบเทียบการทำงาน (บทความนี้)
  • การทำงานกับ Array และข้อมูลรูปแบบต่างๆ เจาะลึกการ Update ข้อมูล
  • การออกแบบ Schema ของระบบ
  • การทำ Index ใน MongoDB
  • การทำคิวรี่ขั่นสูงด้วย aggregate

ซึ่งผมได้ตัดการทำ Replicate และพวกการทำ Sharding ไรพวกนั่นออกไปเพราะมันขั่นสูงไป และเพื่อให้เห็นภาพแล้วจับจุดให้เป็น เพราะว่าตอนนี้ NoSQL กำลังได้รับความนิยม และมีหลายตัว ตัวที่ง่ายที่สุดเห็นจะเป็น MongoDB ซึ่งเป็นแบบ Document Store หรือ Document Base และยังมีอีกหลายๆ Model Link1 Link2 Link3 และในแต่ละบทความผมก็ได้รวบรวมเอา Best Practices เท่าที่ผมหาได้รวมกับประสบการณ์ด้วยนิดหน่อยมาบอกกัน

เปรียบเทียบคำศัทพ์ระหว่าง Relational กับ MongoDB

RelationalMongoDB
TableCollection
RowDocument
IndexIndex
Columnfield
Joinsembedded documents and linking
Primary key

Specify any unique column or column combination as primary key.

Primary key

The primary key is automatically set to the _id field.

aggregation (e.g. group by)aggregation pipeline (SQL to Aggregation Mapping Chart)

ที่มา SQL to MongoDB Mapping Chart

เปรียบเทียบระหว่างคำสั่ง SQL กับ MongoDB Query Language

Create SQL

Create MongoDB

MongoDB ถ้าใส่ insert เข้าไปเลย ถ้าไม่มี Collection นั่นอยู่มันจะใช้คำสั่ง createCollection ให้เลย และเราก็ระบุ type ลงได้เลยตามใจชอบ ผลที่ได้จะออกแบบนี้

เราก็จะได้ข้อมูลแบบ JSON สังเกตว่าจะเพิ่มมาคือ _id นั่นคือ primary key ที่ระบบสร้างให้เราเองครับ

ข้อควรจำใน MongoDB มีคำสั่งทั่ง inset() , save () ข้อแต่ต่างคือ

  1. save() ถ้าเราใช้ในการทำ insert และเราไม่ได้ระบุ _id ลงไป (เราสามารถใส่ค่า _id เองได้โดยที่ไม่ให้ MongoDB สร้างให้ก็ได้) มันจะไปเรียก insert() มาทำงานแทนตัวมันเอง
  2. save() ถ้าเราใส่ _id ลงไปจะเป็นการทำงานกำกึ่งระหว่าง update / insert (ใน Official เรียกมันว่าการทำ update แต่ผมว่าไม่จริง) เพราะระบบจะไปค้นว่า _id ที่ใส่ลงไปมีในระบบหรือยัง ถ้ายังก็ไป insert() ถ้ามีแล้วก็ไปเปลี่ยนค่าของเก่า เพราะงั่น save จะให้ประสิทธิ์ภาพการทำงานที่ตำกว่า insert() เพราะมันต้องวนลูปค้นหาก่อนค่อยเลือกว่า update / insert ดี

Alter table SQL

Alter MongoDB

{ } ตัวแรกเป็นการระบุ option ว่าจะให้ไป update ค่าอะไรลงไป key ไหน value อะไร ส่วน $set: { join_date: new Date() } ให้ไปเพิ่มฟิลด์ join_date ในคอลเล็กชัน และ multi: true ให้บอกให้ระบบอัพเดททุกๆ document ในคอลเล็กชัน users และการทำ drop ก็คล้ายๆ กันแค่เป็นเป็น $unset


Index SQL / Index MongoDB

ส่วนนี้จะข้อไปพูดในบทความหน้า เพราะมันต้องอธิบายหลายเคสครับ


Insert SQL

Insert MongoDB

ข้อควรจำใน ฟิลด์ age คุณสามารถใส่ได้ทั่ง Number และ String ดังนั่นจะมีผลกับการค้นหาข้อมูลเพราะ “45” กับ 45 ไม่เหมือนกันระบบอาจจะค้นหาไม่เจอ ดังนั่นตรวจสอบข้อมูลดีๆ ก่อนใส่ไป


SQL (ALL)

MongoDB (ALL)


SQL (Fields name )

MongoDB (Fields name )

ผลที่ได้

ข้อควรจำใน { } ตัวแรกจะเป็นเงือนไขในการค้นหา ถ้าไม่ใส่แปลให้ find() ออกมาหมดครับ ส่วน { } อันที่สองเป็นการเลือกฟิลด์ที่จะแสดง มีอยู่สองค่า 1 / 0  ถ้าหากใส่ 1 แปลว่าคิวรี่ฟิลด์นั่นมาด้วย ถ้าใส่ 0  แปลว่าคิวรี่แต่ไม่ต้องใส่ฟิลด์นั่นมา และข้อสั่งเกตอีกอย่างนึคือตรงส่วนผลลัพธ์ที่ได้จะมีการใส่ _id นั่นคือ primary มาออกมาโดยปริยาย จะไม่เหมือน SQL คือเราต้องใส่เงือนไขลงไปด้วย

ผลที่ได้คือ

ในเงื่อนไขเราใส่ _id: 0 ดังนั่นฟิลด์นี้จะไม่ถูกนำออกมาใส่ในผลลัพธ์


SQL (Where)

MongoDB (Where)

 { } แรกคือเงือนไขการทำ where ครับ ในตัวอย่างใน status: “A” แปลว่าให้หาว่าเอกสารไหนมีค่าตรงกับเงือนไขบ้าง และส่วนผลที่ได้คือจะได้ทุกฟิลด์ออกมาเลยเพราะเราไม่ได้ใส่บล๊อคที่สองลงไป (ปกติผมเขียน NodeJS ก็ไม่ได้ใส่หรอกยกเว้นกรณีพิเศษอย่างฟิลด์ password ของ user ที่ต้องตัดออก) หรือเราทำอีกแบบตัดฟิดล์ออกและเลือกฟิลด์ที่แสดงแบบข้างบน


SQL ( Not Equal )

MongoDB ( Not Equal )

ข้อควรจำใน $ne เป็น operator ของระบบเวลาใช้ให้ใส่เป็น JSON ลงไป แบบในตัวอย่าง


SQL (AND )

MongoDB (AND )

ข้อควรจำใน ปกติถ้าเรา AND เราเพิ่งแค่ใส่สิ่งที่ต้องการลงไปเลยแบบตัวอย่างแรก แต่บางกรณีอาจจะเปลี่ยนมาใช้ $and ซึ่งเป็น operator ของระบบอีกแบบนึงใช้ทำเงือนไข AND โดยเงือนไขการใช้คือต้องใส่ array ของ object เข้าไป แบบนี้ $and:[{}, {} …n ]


SQL (OR)

MongoDB (OR)

ข้อควรจำใน $or เป็น operator ของระบบอีกแบบนึงใช้ทำเงือนไข OR โดยเงือนไขการใช้คือต้องใส่ array ของ object เข้าไปแบบเดียวกับ AND แบบนี้ $or:[{}, {} …n ]


SQL (< and >)

MongoDB (< and >)

ข้อควรจำใน $gt หาค่ามากกว่า / $lt หาค่าน้อยกว่า หาเติม e ลงไป เช่น $gte / $lte จะเป็นการเพิ่มเช็คเรื่องเท่ากับลงไปด้วย


SQL (LIKE)

MongoDB (LIKE)

ข้อควรจำใน คำสั่งอย่าง like นั่น MongoDB จะใช้ regular expression ในการค้นหาดังนั่นผมแนะนำให้ไปศึกษาการเขียน regular expression เพิ่มเติม


SQL (Sort and Oder)

MongoDB (Sort and Oder)

ข้อควรจำใน การใช้ sort() เพียงแค่เราใส่ฟิลด์ที่เราต้องการลงไประบบจะเรียงข้อมูลให้เราทันและมีออฟชั่นสองตัวคือ 1 (ASC) , -1 (DESC) นั่นเองครับ


SQL (Count)

MongoDB (Count)

ข้อควรจำใน $exists ถ้าค่าเป็น true จะอ่านค่าฟิลด์นั่นๆ ทั่งหมดรวมถึงถ้าฟิลด์นั่นมีค่า null ระบบก็จะนับมาอ่านด้วย ถ้าค่าเป็น false จะทำการตัดฟิลด์นั่นออกไม่นับมาคิวรี่ด้วย แต่* $exists อย่าทำไปใช้กับการทำ search นะครับมันมีผลกับ performance บางเคสฝรั่งเอามาใช้ทำ search ซึ่งผมแนะนำว่าให้ทำ index ดีกว่าครับ บทความหน้าผมจะมาเขียนเรื่อง index ให้ครับ


SQL (Distinct)

MongoDB (Distinct)

ตรงนี้ไม่อะไรมาก แต่ MongoDB มีตัวที่สามารถทำ Distinct ได้เหมือนกันและ MongoDB เองก็แนะนำให้ไปใช้งานก็คือ Aggregation เป็น Advance Query อย่างนึง


SQL (Limit)

MongoDB (Limit)


SQL (Skip)

MongoDB (Skip)


SQL (Explain)

MongoDB (Explain)


SQL Update

MongoDB Update

{ } เป็นการระบุเงื่อนไขการค้นหาเพื่อเอาค่าไปอัพเดต ส่วน { } ตัวที่สองจะเป็นเงื่อนไขการใส่ค่าลงไป แบบตัวอย่างเช่น ใช้ $set เป็นคำสั่งในระบบเพื่อให้ใส่ค่าลงไปในฟิลด์ที่ค้นหาเจอ { multi: true } เป็นการบออกให้ระบบอัพเดททุกฟิลด์ที่ค้นหาเจอตามเงือนไข ถ้าเราไม่ใส่ หรือใส่ false ระบบจะอัพเดทค่าแค่ฟิลด์แรกที่ค้นหาเจอ

หมายเหตุ คำสั่ง $inc เป็นคำสั่งเพิ่มค่ในระบบ


SQL Delete (Condition/ALL)

MongoDB Delete (Condition/ALL)

 

ตอนต่อไปจะมาสอนเรื่องการทำงานกับ Array ซึ่งเป็นจุดเด่นอีกอย่างหนึงของการใข้ MongoDB และเจาะลึกการ Update ข้อมูลและลูกล่นการทำงานกับ Array ถือว่าดีใช้ได้ครับ คาดว่าหลายๆ คนคงคิดไม่ถึงแน่ๆ อย่าลืมติดต่อนะครับ

Facebook Comments