ใช้ $addToSet เพิ่ม Element ใน Array (ป้องกัน Duplicate)
โอเปอเรเตอร์ $addToSet เพิ่มค่าเข้า Array ก็ต่อเมื่อค่านั้น ยังไม่มีอยู่ (Unique) ร่วมกับ Positional Operator $ เพื่อระบุ Array Element ที่จะ Update
ตัวอย่างข้อมูล: Client Details มี DeveloperDetails เป็น Array ว่าง
> db.updateArrayDemo.insertOne({
"ClientDetails": [
{ "ClientName": "John", "DeveloperDetails": [] },
{ "ClientName": "Larry", "DeveloperDetails": [] }
]
});
คำสั่ง: เพิ่ม Technology Object ให้ Larry (ClientDetails Element ที่ ClientName=Larry)
> db.updateArrayDemo.update(
{ "ClientDetails.ClientName": "Larry" },
{ $addToSet: { "ClientDetails.$.Technology": { 'DeveloperName': "Chris", 'WorkExperience': 5 } } },
false, // upsert
true // multi
);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
ผลลัพธ์: Larry มี Technology Array ใหม่
> db.updateArrayDemo.find().pretty();
{
"ClientDetails" : [
{ "ClientName" : "John", "DeveloperDetails" : [ ] },
{ "ClientName" : "Larry", "DeveloperDetails" : [ ], "Technology" : [
{ "DeveloperName" : "Chris", "WorkExperience" : 5 }
] }
]
}
คำอธิบาย
- Query:
{ "ClientDetails.ClientName": "Larry" } Match Element ใน ClientDetails Array - Update:
{ $addToSet: { "ClientDetails.$.Technology": { ... } } }-$อ้างอิง Element ที่ Match $addToSetเพิ่ม Object ใหม่เข้า Technology Array (สร้าง Array ใหม่ถ้ายังไม่มี)
Array Update Operators เปรียบเทียบ
| Operator | พฤติกรรม | Duplicate |
|---|---|---|
$push | เพิ่มต่อท้ายเสมอ | ✅ อนุญาต |
$addToSet | เพิ่มก็ต่อเมื่อไม่มี | ❌ กัน Duplicate |
$push + $each | เพิ่มหลายค่าพร้อมกัน | ✅ อนุญาต |
$addToSet + $each | เพิ่มหลายค่า กัน Duplicate | ❌ กัน Duplicate |
$set (Positional) | แทนที่ Element ทั้งตัว | N/A |
Modern Syntax (MongoDB 3.6+)
// updateOne/UpdateMany + Array Filters (แม่นยำกว่า Positional $)
db.updateArrayDemo.updateOne(
{ "ClientDetails.ClientName": "Larry" },
{ $addToSet: { "ClientDetails.$[elem].Technology": { DeveloperName: "Chris", WorkExperience: 5 } } },
{ arrayFilters: [{ "elem.ClientName": "Larry" }] }
);
Array Filters ข้อดี
- Match หลายเงื่อนไขใน Element เดียวกัน
- Update หลาย Element ใน Array เดียวได้ (Multi-match)
- อ่านง่ายกว่า Positional $