อัปเดตเฉพาะออบเจกต์ในอาร์เรย์ที่ตรงตามเงื่อนไขด้วย 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"