Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

การค้นหาและอัปเดตอาร์เรย์ย่อยด้วย Positional $ Operator ใน MongoDB

อัปเดตองค์ประกอบเฉพาะในอาร์เรย์ด้วย Positional $ Operator

เมื่อต้องการอัปเดตเฉพาะองค์ประกอบในอาร์เรย์ที่ตรงตามเงื่อนไข ใช้ Positional $ Operator ซึ่งจะอ้างอิงถึงตำแหน่งขององค์ประกอบที่ match กับ query condition

ตัวอย่างข้อมูลทดสอบ

> db.demo49.insertOne({
  "Name": "David",
  "Details": [
    { "_id": "D1234", "Subject": "MySQL" },
    { "_id": "E234", "Subject": "Java" },
    { "_id": "F456", "Subject": "Python" }
  ]
});

แสดงข้อมูลก่อนอัปเดต

> db.demo49.find();

ผลลัพธ์:

{
  "_id": ObjectId("5e270a77cfb11e5c34d89902"),
  "Name": "David",
  "Details": [
    { "_id": "D1234", "Subject": "MySQL" },
    { "_id": "E234", "Subject": "Java" },
    { "_id": "F456", "Subject": "Python" }
  ]
}

คำสั่งอัปเดต Subject ของ Details ที่ _id เป็น E234

> db.demo49.update(
  { "Details._id": "E234" },
  { $set: { "Details.$.Subject": "MongoDB" } },
  false,
  true
);

ผลลัพธ์: WriteResult({ "nMatched": 1, "nUpserted": 0, "nModified": 1 })

แสดงข้อมูลหลังอัปเดต

> db.demo49.find();

ผลลัพธ์:

{
  "_id": ObjectId("5e270a77cfb11e5c34d89902"),
  "Name": "David",
  "Details": [
    { "_id": "D1234", "Subject": "MySQL" },
    { "_id": "E234", "Subject": "MongoDB" },
    { "_id": "F456", "Subject": "Python" }
  ]
}

คำอธิบาย

  • { "Details._id": "E234" }: ค้นหาเอกสารที่มีอาร์เรย์ Details ประกอบด้วยองค์ประกอบที่ _id = "E234"
  • Details.$.Subject: ตัวดำเนินการ $ จะชี้ไปที่องค์ประกอบแรกที่ match ในอาร์เรย์ Details
  • false, true: พารามิเตอร์ upsert=false, multi=true (รูปแบบเก่า)

รูปแบบใหม่ (แนะนำ): ใช้ updateOne() หรือ updateMany() แทน update()