Everything Jingle Bell แบบครอบจักวาล MongoDB [ตอนที่ 2.2: Array และลูป]

ต่อจากตอนที่ 2.1 link ตอนนี้เราจะมาเรียนรู้วิธีการใช้งานเรื่อง Array ให้มันแอดวานซ์ขึ้นไปอีก เพราะนอกในตอนที่แล้วผมพูดถึงเรื่องคำสั่งในการอัพเดทข้อมูลและคำสั่งที่ใช้กับการจัดการข้อมูลแบบ Array บทความนี้เราจะมาต่อเรื่องการจัดการกับ Array อีกสั่กหน่อยแต่บทความนี้จะมาพูดถึงเรื่องการใช้คำสั่งอื่นๆ ได้แก่ การวนลูป การตัดสมาชิกในอาเรย์ การเรียงข้อมูลและการหาตำแหน่งของสมาชิก

NameDescription
$eachเป็นคำสั่งที่ใช้งานร่วมกับ $push และ $addToSet สำหรับต้องการทำงานแบบ multiple items
$sliceเป็นคำสั่งที่ใช้งานร่วมกับ $push สำหรับกำหนดขนาดข้อมูลที่จะอัพเดท
$sortเป็นคำสั่งที่ใช้งานร่วมกับ $push สำหรับเรียงข้อมูล
$positionเป็นคำสั่งที่ใช้งานร่วมกับ $push เพื่อระบุตำแหน่งของ array สำหรับการเพิ่มข้อมูล

 

$each

ก่อนอื่นข้อย้อนกลับไปตอนที่แล้วคือการใช้ $push ปกติการที่เราจะใส่ข้อมูลเพิ่มจากที่มีอยู่เราจะใส่ได้ทีละหนึ่ง นั่นหมายความว่าถ้าเราส่ง array มาจาก user เราจะอัพเดทด้วยวิธี $push ปกติไม่ได้ จริงๆ เราอาจจะเขียนโปรแกรมวนลูปแล้ว add ข้อมูลเองซึ่งถ้าเรามี

[1,2,3,4,5,6,7,8,9 … 500]

 ลองนึกดูว่าถ้ามีข้อมูล 500 ชุด ถ้าต้องวนลูป for สัก 500 ครั่งเพื่อให้ใช้ $push เพิ่มข้อมูลได้หมดระบบเรามีหวังพังแน่เพราะเราต้องปิด-เปิด connection ระหว่างระบบกับฐานข้อมูลจำนวน 500 ครั่ง หรือถ้าเราเอาทั่งก้อน array ใส่ลงไปเลยละ ผลที่ได้คือ

เราจะได้ข้อมูลที่มี array เข้าซ้อนอีกชั้น

data: [2, 4, [1,2,3,4,5,6,7,8,9 … 500] , 6,4 2]

ดังนั่นเราจึงต้องให้ระบบมันทำให้เราดีกว่าดวยการโยนข้อมูลลงไปแล้วให้ระบบไปจัดการวนลูปให้ด้วย $each ซึ่งจะใช้คู่กับคำสั่ง $push และ $addToSet แบบนี้ครับ

{ $addToSet: { <field>: { $each: [ <value1>, <value2> … ] } } }

{ $push: { <field>: { $each: [ <value1>, <value2> … ] } } }

ตัวอย่างการใช้งานเช่น ต้องการนำค่าจาก user ที่ประกอบด้วย [90 , 92, 85] มาอัพเดทให้สินค้าเรา

เราก็จะได้ชุดข้อมูลใส่ลงไปในข้อมูลเดิมแบบนี้ครับ

{ _id: 2, name: “apple”, prices: [ 20, 40,  90, 92, 85] }

สำหรับ $addToSet ก็เหมือนกับ $push ดังนั่นผมจะไม่ข้อยกตัวอย่างเพิ่มวิธีเขียนเหมือนกันครับ

 

$slice

อัพเดทข้อมูลจากหลังมาหน้า

สมุติว่าเรามีข้อมูลแบบนี้

{ “_id” : 1, “scores” : [ 40, 50, 60 ] }

และเมื่อระบบอัพเดทให้เราก็จะได้แบบนี้

{ “_id” : 1, “scores” : [ 50, 60, 80, 78, 86 ] }

จากเดิม

{ “_id” : 1, “scores” : [ 40, 50, 60 ] }

จากเหตุก็เพราะว่าเราบอกให้มัน slice ข้อมูลเริ่มจากตัวท้ายสุด (เพราะเราใส่ค่าติดลบ) ดงนั่นระบบจะทำการใส่ข้อมูลทั่งหมดลงไปก่อนแล้วทำการตัดให้เหลือ 5 จากท้ายสุด [40,50, 60, 80, 78, 86 ] เมื่อนับจากท้ายก็เหลือ [ 50, 60, 80, 78, 86 ] ดังนั่น 40 จึงถูกตัดออกไป

 

อัพเดทข้อมูลจากหน้าไปหลัง 

จากข้อมูลเดิมข้างบนนะครับ เราก็เปลี่ยนคำสั่งใหม่เป็น

เราก็จะได้

{ “_id” : 1, “scores” : [ 40, 50, 60, 80, 78 ] }

จากเดิม

{ “_id” : 1, “scores” : [ 40, 50, 60 ] }

ซึ่งการทำงานก็คล้ายๆ กับแบบที่บอกไปข้างบนครับ

 

ตัดข้อมูลในฐานข้อมูลทิ้ง 

{ “_id” : 1, “scores” : [ 40 ] }

จากเดิม

{ “_id” : 1, “scores” : [ 40, 50, 60 ] }

เราสามารถตัดข้อมูลทิ้งได้แบบด้วยครับ

 

$sort

ข้อควรจำการใช้ $sort จะต้องใช้คู่กับ $each เสมอครับ

ตัวอย่างรูปแบบการใช้ทั่วไปจะเป็นแบบนี้ครับ

สมุติถ้าเรามีข้อมูลแบบนี้

ลองทำการอัพเดทดู

ผลที่ออกมา

หลังจากการ $push ระบบก็จะไป sort ข้อมูลให้นั่นเองครับ

 

$position

สมุติว่าเรามีข้อมูลแบบนี้

{ “_id” : 1, “scores” : [ 100 ] }

ลองสั่งอัพเดทข้อมูลดู

เราก็จะได้

{ “_id” : 1, “scores” : [ 50, 60, 70, 100 ] }

ระบบมันก็จะเอาข้อมูลเราไปเพิ่มให้โดยแทรกที่ตำแหน่งที่ 0 ให้เราครับ ง่ายๆ คำสั่งนี้ไม่มีไรมาก

 

สำหรับบทความนี้ก็มีเท่านี้ครับ หวังว่าคงจะไปปรับใช้กันได้นะครับ เจอกันตอนนี้หน้ากับการออกแบบ Schema ของระบบ

 

Facebook Comments