ข้ามไปยังเนื้อหาหลัก
คู่มือระบบ เนื้อหาผ่านการตรวจสอบแล้ว

CRUD Operations: สร้าง อ่าน แก้ไข ลบ Document

บทความนี้อธิบายการดำเนินการ CRUD (Create, Read, Update, Delete) ใน MongoDB โดยเน้นที่การใช้คำสั่ง `insertOne()`, `insertMany()` สำหรับการสร้าง Document, `find()...

CRUD Operations: สร้าง อ่าน แก้ไข ลบ Document

ในบทที่แล้ว เราได้ทำความรู้จักกับ MongoDB Shell (mongosh) และวิธีการใช้งานเบื้องต้นกันไปแล้ว ในบทนี้ เราจะมาเรียนรู้การจัดการข้อมูลใน MongoDB อย่างละเอียด โดยครอบคลุมการดำเนินการพื้นฐานที่เรียกว่า CRUD ซึ่งย่อมาจาก Create (สร้าง), Read (อ่าน), Update (แก้ไข), และ Delete (ลบ) Document

การเพิ่ม Document: insertOne(), insertMany()

การเพิ่ม Document ใหม่ลงใน Collection ทำได้โดยใช้คำสั่ง insertOne() สำหรับการเพิ่ม Document เดียว และ insertMany() สำหรับการเพิ่มหลาย Document พร้อมกัน

insertOne()

คำสั่ง insertOne() จะรับ Document ที่ต้องการเพิ่มเป็น Parameter ตัวอย่าง:

db.products.insertOne({
  name: "เสื้อยืดคอกลม",
  price: 250,
  category: "เสื้อผ้า",
  inStock: true
})

คำสั่งนี้จะเพิ่ม Document ใหม่ที่มีข้อมูลเกี่ยวกับเสื้อยืดคอกลมลงใน Collection ที่ชื่อว่า products

ผลลัพธ์: หลังจากรันคำสั่งสำเร็จ คุณจะได้รับผลลัพธ์ที่คล้ายกับนี้:

{
  "acknowledged" : true,
  "insertedId" : ObjectId("64c9a8e3f04e5498a8b7c6d1")
}

acknowledged: true หมายถึงการดำเนินการสำเร็จ และ insertedId คือ ObjectId ที่ MongoDB สร้างขึ้นเพื่อเป็น Unique Identifier ของ Document ใหม่

insertMany()

หากต้องการเพิ่ม Document หลายรายการพร้อมกัน เราสามารถใช้ insertMany() โดยส่ง Array ของ Document เป็น Parameter ตัวอย่าง:

db.products.insertMany([
  { name: "กางเกงยีนส์", price: 790, category: "เสื้อผ้า", inStock: true },
  { name: "รองเท้าผ้าใบ", price: 1200, category: "รองเท้า", inStock: false },
  { name: "หมวกแก๊ป", price: 350, category: "เครื่องประดับ", inStock: true }
])

คำสั่งนี้จะเพิ่ม Document 3 รายการเกี่ยวกับกางเกงยีนส์, รองเท้าผ้าใบ, และหมวกแก๊ป ลงใน Collection products

ผลลัพธ์:

{
  "acknowledged" : true,
  "insertedIds" : [
    ObjectId("64c9a982f04e5498a8b7c6d2"),
    ObjectId("64c9a982f04e5498a8b7c6d3"),
    ObjectId("64c9a982f04e5498a8b7c6d4")
  ]
}

insertedIds จะเป็น Array ของ ObjectId ที่ MongoDB สร้างขึ้นสำหรับแต่ละ Document ที่เพิ่มเข้าไป

เหตุผลเชิงออกแบบและแนวปฏิบัติที่ดี:

  • การใช้ ObjectId: MongoDB ใช้ ObjectId เป็น Primary Key โดยอัตโนมัติ ซึ่งช่วยให้มั่นใจได้ว่าแต่ละ Document จะมี Unique Identifier ที่ไม่ซ้ำกันทั่วทั้ง Database
  • Schema Flexibility: MongoDB เป็น Schema-less Database นั่นหมายความว่า Document ใน Collection เดียวกันไม่จำเป็นต้องมี Field เหมือนกันทั้งหมด อย่างไรก็ตาม การวางแผน Schema อย่างรอบคอบจะช่วยให้การ Query ข้อมูลมีประสิทธิภาพมากยิ่งขึ้น
  • Data Validation: แม้ว่า MongoDB จะเป็น Schema-less แต่เราสามารถกำหนด Validation Rules เพื่อควบคุมรูปแบบและชนิดของข้อมูลที่สามารถเพิ่มลงใน Collection ได้ (จะกล่าวถึงในบทความระดับสูงกว่า)

การอ่าน Document: find()

การอ่าน Document จาก Collection ทำได้โดยใช้คำสั่ง find()

find() แบบไม่มีเงื่อนไข

หากต้องการอ่าน Document ทั้งหมดใน Collection ให้ใช้ find() โดยไม่มี Parameter ใดๆ:

db.products.find()

คำสั่งนี้จะแสดง Document ทั้งหมดใน Collection products

find() แบบมีเงื่อนไข

หากต้องการอ่าน Document ที่ตรงตามเงื่อนไขที่กำหนด ให้ส่ง Query Document เป็น Parameter ตัวอย่าง:

db.products.find({ category: "เสื้อผ้า" })

คำสั่งนี้จะแสดง Document ทั้งหมดใน Collection products ที่มี Field category เท่ากับ "เสื้อผ้า"

การกำหนด Fields ที่ต้องการแสดงผล: เราสามารถระบุ Fields ที่ต้องการให้แสดงผลได้ โดยใช้ Projection Document เป็น Parameter ที่สองของ find() ตัวอย่าง:

db.products.find({ category: "เสื้อผ้า" }, { name: 1, price: 1, _id: 0 })

คำสั่งนี้จะแสดงเฉพาะ Fields name และ price ของ Document ที่มี category เท่ากับ "เสื้อผ้า" โดย _id: 0 หมายถึงไม่ต้องการแสดง Field _id (ซึ่งจะแสดงโดย Default)

เหตุผลเชิงออกแบบและแนวปฏิบัติที่ดี:

  • Index: เพื่อเพิ่มประสิทธิภาพในการ Query ข้อมูล ควรสร้าง Index บน Fields ที่ใช้ในการค้นหาบ่อยๆ (จะกล่าวถึงในบทความระดับสูงกว่า)
  • Projection: การระบุ Fields ที่ต้องการแสดงผล (Projection) ช่วยลดปริมาณข้อมูลที่ส่งกลับมา ทำให้การ Query เร็วขึ้น

การแก้ไข Document: updateOne(), updateMany()

การแก้ไข Document ใน Collection ทำได้โดยใช้คำสั่ง updateOne() สำหรับการแก้ไข Document เดียว และ updateMany() สำหรับการแก้ไขหลาย Document พร้อมกัน

updateOne()

คำสั่ง updateOne() รับ Parameter สองตัว: Query Document (เพื่อระบุ Document ที่ต้องการแก้ไข) และ Update Document (เพื่อระบุการเปลี่ยนแปลงที่ต้องการ) ตัวอย่าง:

db.products.updateOne(
  { name: "เสื้อยืดคอกลม" },
  { $set: { price: 280 } }
)

คำสั่งนี้จะแก้ไข Document ที่มี name เท่ากับ "เสื้อยืดคอกลม" โดยเปลี่ยน Field price ให้เป็น 280

$set Operator: $set เป็น Update Operator ที่ใช้เพื่อแก้ไขค่าของ Field ที่มีอยู่ หรือเพิ่ม Field ใหม่ หาก Field นั้นยังไม่มี

updateMany()

คำสั่ง updateMany() ทำงานคล้ายกับ updateOne() แต่จะแก้ไข Document ทั้งหมดที่ตรงตามเงื่อนไขใน Query Document ตัวอย่าง:

db.products.updateMany(
  { category: "เสื้อผ้า" },
  { $inc: { price: 10 } }
)

คำสั่งนี้จะแก้ไข Document ทั้งหมดที่มี category เท่ากับ "เสื้อผ้า" โดยเพิ่มค่า price ขึ้นอีก 10

$inc Operator: $inc เป็น Update Operator ที่ใช้เพื่อเพิ่ม (หรือลด) ค่าของ Field ที่เป็นตัวเลข

เหตุผลเชิงออกแบบและแนวปฏิบัติที่ดี:

  • Atomic Operations: MongoDB รับประกันว่าการ Update Document จะเป็น Atomic Operation นั่นหมายความว่าการ Update จะสำเร็จทั้งหมด หรือไม่สำเร็จเลย ทำให้มั่นใจได้ว่าข้อมูลจะไม่เกิดความไม่สอดคล้องกัน
  • Update Operators: MongoDB มี Update Operators มากมาย เช่น $set, $inc, $push, $pull ซึ่งช่วยให้การ Update ข้อมูลเป็นไปอย่างมีประสิทธิภาพและยืดหยุ่น
  • ป้องกัน Race Conditions: เมื่อมีการแก้ไขข้อมูลพร้อมกันจากหลายแหล่ง ควรใช้ Atomic Operators เพื่อหลีกเลี่ยง Race Conditions และความผิดพลาดของข้อมูล

การลบ Document: deleteOne(), deleteMany()

การลบ Document ออกจาก Collection ทำได้โดยใช้คำสั่ง deleteOne() สำหรับการลบ Document เดียว และ deleteMany() สำหรับการลบหลาย Document พร้อมกัน

deleteOne()

คำสั่ง deleteOne() รับ Query Document เป็น Parameter เพื่อระบุ Document ที่ต้องการลบ ตัวอย่าง:

db.products.deleteOne({ name: "หมวกแก๊ป" })

คำสั่งนี้จะลบ Document ที่มี name เท่ากับ "หมวกแก๊ป" ออกจาก Collection products

deleteMany()

คำสั่ง deleteMany() ทำงานคล้ายกับ deleteOne() แต่จะลบ Document ทั้งหมดที่ตรงตามเงื่อนไขใน Query Document ตัวอย่าง:

db.products.deleteMany({ inStock: false })

คำสั่งนี้จะลบ Document ทั้งหมดที่มี inStock เท่ากับ false ออกจาก Collection products

เหตุผลเชิงออกแบบและแนวปฏิบัติที่ดี:

  • ระมัดระวังในการลบข้อมูล: การลบข้อมูลเป็นการดำเนินการที่ไม่สามารถย้อนกลับได้ ควรตรวจสอบให้แน่ใจว่าเงื่อนไขในการลบถูกต้องก่อนที่จะดำเนินการ
  • การ Archive ข้อมูล: แทนที่จะลบข้อมูลที่ไม่ได้ใช้งานแล้ว อาจพิจารณา Archive ข้อมูลเหล่านั้นไปยัง Collection อื่น เพื่อเก็บรักษาข้อมูลในระยะยาว
  • Performance: การลบข้อมูลจำนวนมากอาจส่งผลกระทบต่อ Performance ของ Database ควรพิจารณาใช้ Bulk Operations หรือ Batch Processing เพื่อลดผลกระทบ

ในบทนี้ เราได้เรียนรู้การดำเนินการ CRUD พื้นฐานใน MongoDB ซึ่งเป็นพื้นฐานสำคัญในการจัดการข้อมูลใน Database ในบทถัดไป เราจะมาเจาะลึกเรื่อง Query Operators ซึ่งจะช่วยให้เราสามารถค้นหาข้อมูลได้อย่างแม่นยำและมีประสิทธิภาพมากยิ่งขึ้น

Office.in.th Custom Service

ต้องการพัฒนาระบบหรือปรับแต่งจากโครงสร้างนี้?

Office.in.th รับพัฒนาและออกแบบ Enterprise Web Application, API Integration และระบบบริหารงานภาครัฐ/เอกชน พร้อมการสนับสนุนระยะยาว

ดูบริการรับพัฒนาซอฟต์แวร์