การอัปเดตเอกสาร MongoDB โดยใช้ mongo shell

บทนี้จะแนะนำการอัปเดตข้อมูลเอกสาร MongoDB ผ่าน mongo shell ซึ่ง MongoDB รองรับวิธีการอัปเดตต่าง ๆ ที่ถูกนำมาปฏิบัติด้วยตัวดำเนินการต่าง ๆ และรองรับฟังก์ชันอัปเดตหลาย ๆ ฟังก์ชันด้วย

เตรียมข้อมูลทดสอบ

แทรกชุดข้อมูลทดสอบลงในคอลเลกชัน inventory

db.inventory.insertMany( [
   { item: "canvas", qty: 100, size: { h: 28, w: 35.5, uom: "cm" }, status: "A" },
   { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "mat", qty: 85, size: { h: 27.9, w: 35.5, uom: "cm" }, status: "A" },
   { item: "mousepad", qty: 25, size: { h: 19, w: 22.85, uom: "cm" }, status: "P" },
   { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "P" },
   { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
   { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
   { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" },
   { item: "sketchbook", qty: 80, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "sketch pad", qty: 95, size: { h: 22.85, w: 30.5, uom: "cm" }, status: "A" }
] );

รูปแบบของตัวดำเนินการอัปเดต

เพื่ออัปเดตเอกสาร MongoDB มีตัวดำเนินการอัปเดตหลาย ๆ ตัว (เช่น $set) เพื่อปรับเปลี่ยนค่าฟิลด์

รูปแบบของพารามิเตอร์ตัวดำเนินการอัปเดตเป็นดังนี้:

{
  <ตัวดำเนินการอัปเดต>: { <ฟิลด์1>: <ค่า1>, ... },
  <ตัวดำเนินการอัปเดต>: { <ฟิลด์2>: <ค่า2>, ... },
  ...
}

การอธิบาย:

  • <ตัวดำเนินการอัปเดต>: ตัวดำเนินการอัปเดต
  • <ฟิลด์1>: ชื่อฟิลด์
  • <ค่า1>: พารามิเตอร์ของฟิลด์

ตัวดำเนินการ $set

ใช้เพื่ออัปเดตเอกสารและสร้างฟิลด์ใหม่หากฟิลด์นั้นไม่มีอยู่

การอัปเดตเอกสารเดียว

อัปเดตเอกสารโดยใช้เมธอด db.collection.updateOne()

db.inventory.updateOne(
   { item: "paper" },
   {
     $set: { "size.uom": "cm", status: "P" },
     $currentDate: { lastModified: true }
   }
)

การอัปเดตอธิบาย:

  • ต้องการเรียกเอกสารแรกโดยใช้เงื่อนไขคิวรี (item = paper)
  • ใช้ตัวดำเนินการ $set เพื่ออัปเดตค่าของฟิลด์ size.uom เป็น cm และอัปเดตค่าของฟิลด์ status เป็น P
  • ใช้ตัวดำเนินการ $currentDate เพื่ออัปเดตค่าของฟิลด์ lastModified เป็นวันที่ปัจจุบัน หากฟิลด์ lastModified ไม่มีอยู่ $currentDate จะสร้างฟิลด์

การอัปเดตหลายเอกสาร

ใช้เมธอด db.collection.updateMany() เพื่ออัปเดตหลายเอกสารที่ตรงตามเงื่อนไข

db.inventory.updateMany(
   { "qty": { $lt: 50 } },
   {
     $set: { "size.uom": "in", status: "P" },
     $currentDate: { lastModified: true }
   }
)

การอัปเดตอธิบาย:

  • ต้องการเรียกเอกสารทั้งหมดโดยใช้เงื่อนไขคิวรี (qty < 50)
  • ใช้ตัวดำเนินการ $set เพื่ออัปเดตค่าของฟิลด์ size.uom เป็น in และอัปเดตค่าของฟิลด์ status เป็น P
  • ใช้ตัวดำเนินการ $currentDate เพื่ออัปเดตค่าของฟิลด์ lastModified เป็นวันที่ปัจจุบัน หากฟิลด์ lastModified ไม่มีอยู่ $currentDate จะสร้างฟิลด์

เคล็ดลับ: ตัวดำเนินการ $lt แทนความหมายของน้อยกว่า

การแทนที่เอกสาร

ใช้เมธอด db.collection.replaceOne() เพื่อแทนที่เนื้อหาของเอกสาร (ยกเว้นฟิลด์ _id) สามารถใช้เอกสารที่จะแทนที่ได้มีฟิลด์ที่แตกต่างจากเอกสารเดิม โดยที่ฟิลด์ _id เป็นค่าคงที่ สามารถให้มันเป็นไปได้ แต่ถ้าคุณรวมฟิลด์ _id ค่า id ต้องเป็นคงที่กับ id ของเอกสารที่กำลังถูกอัพเดต

db.inventory.replaceOne(
   { item: "paper" },
   { item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 40 } ] }
)

อธิบาย:

  • ก่อนอื่นใช้เกณฑ์คิด(query criteria) (item=paper) เพื่อดึงเอกสารตัวแรก
  • แทนที่เอกสารที่ตรงกับเนื้อหาของพารามิเตอร์ที่สองของเมธอด replaceOne

พฤติกรรมการอัพเดต

ความไม่สามารถแบ่งแยก

การดำเนินการเขียนทั้งหมดใน MongoDB มีความไม่สามารถแบ่งแยกที่ระดับเอกสารแต่ละรายการ

ฟิลด์ _id

ฟิลด์ _id เป็นค่าคงที่และไม่สามารถอัพเดตได้