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

การอัปเดตออบเจกต์ในอาร์เรย์ด้วยคีย์เฉพาะใน MongoDB

อัปเดตเฉพาะออบเจกต์ในอาร์เรย์ที่ตรงตามเงื่อนไขด้วย Positional $ Operator

ใช้ Positional $ Operator ในคำสั่ง update เพื่ออัปเดตเฉพาะออบเจกต์ในอาร์เรย์ที่ match กับเงื่อนไขค้นหา

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

> db.demo419.insertOne({
  "ProductInformation": [
    { "ProductName": "Product-1", "ProductPrice": 500 },
    { "ProductName": "Product-2", "ProductPrice": 600 }
  ]
});

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

> db.demo419.find();

ผลลัพธ์:

{
  "_id": ObjectId("5e724762b912067e57771ae8"),
  "ProductInformation": [
    { "ProductName": "Product-1", "ProductPrice": 500 },
    { "ProductName": "Product-2", "ProductPrice": 600 }
  ]
}

คำสั่งอัปเดต ProductPrice ของ Product-1 เป็น 1250

> db.demo419.update(
  { 'ProductInformation.ProductName': "Product-1" },
  { $set: { 'ProductInformation.$.ProductPrice': 1250 } }
);

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

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

> db.demo419.find();

ผลลัพธ์:

{
  "_id": ObjectId("5e724762b912067e57771ae8"),
  "ProductInformation": [
    { "ProductName": "Product-1", "ProductPrice": 1250 },
    { "ProductName": "Product-2", "ProductPrice": 600 }
  ]
}

คำอธิบาย

  • Query: { 'ProductInformation.ProductName': "Product-1" }: หาเอกสารที่อาร์เรย์ ProductInformation มีออบเจกต์ที่ ProductName = "Product-1"
  • Update: { $set: { 'ProductInformation.$.ProductPrice': 1250 } }: ตัว $ ชี้ไปที่ออบเจกต์แรกที่ match ในอาร์เรย์ ProductInformation

ข้อจำกัดของ Positional $ Operator

  • อัปเดตได้เฉพาะ ออบเจกต์แรก ที่ match ในอาร์เรย์
  • หากมีหลายออบเจกต์ที่ ProductName = "Product-1" จะอัปเดตแค่ตัวแรก
  • สำหรับอัปเดตหลายตำแหน่ง ใช้ Filtered Array Updates ($[]) ใน MongoDB 3.6+

ตัวอย่าง Filtered Array Update (MongoDB 3.6+)

> db.demo419.updateMany(
  {},
  { $set: { "ProductInformation.$[elem].ProductPrice": 1250 } },
  { arrayFilters: [{ "elem.ProductName": "Product-1" }] }
);

จะอัปเดตทุกออบเจกต์ในอาร์เรย์ที่ ProductName = "Product-1"