บทความนี้สาธิตการใช้ Operator $addToSet ร่วมกับ update() เพื่อเพิ่มค่าใหม่เข้าไปใน Array โดย ไม่ให้ซ้ำซ้อน (ถ้าค่ามีอยู่แล้วจะไม่เพิ่ม)
สร้างข้อมูลตัวอย่าง
> db.pushElements.insertOne({"Comments":["Good","Awesome","Nice"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd682597924bb85b3f48953") }
แสดงข้อมูลก่อนเพิ่ม
> db.pushElements.find().pretty();
{
"_id" : ObjectId("5cd682597924bb85b3f48953"),
"Comments" : [ "Good", "Awesome", "Nice" ]
}
เพิ่มค่า "Cool" เข้า Array Comments
> db.pushElements.update(
{ _id: ObjectId("5cd682597924bb85b3f48953") },
{ "$addToSet": { "Comments": "Cool" } },
upsert=true
);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
ตรวจสอบผลลัพธ์
> db.pushElements.find().pretty();
{
"_id" : ObjectId("5cd682597924bb85b3f48953"),
"Comments" : [ "Good", "Awesome", "Nice", "Cool" ]
}
ความแตกต่างระหว่าง $addToSet และ $push
| Operator | พฤติกรรม | กรณีค่าซ้ำ |
|---|---|---|
$addToSet | เพิ่มค่าใหม่ถ้ายังไม่มีใน Array | ไม่เพิ่ม (ป้องกัน Duplicate) |
$push | เพิ่มค่าใหม่เสมอ | เพิ่มซ้ำได้ (Allow Duplicate) |
ตัวอย่าง: $addToSet กับ $each (เพิ่มหลายค่าพร้อมกัน)
db.collection.update(
{ _id: ObjectId("...") },
{ $addToSet: { "tags": { $each: ["mongodb", "database", "nosql"] } } }
);
ตัวอย่าง: $addToSet กับ Object (ใช้ฟิลด์เป็น Key ป้องกันซ้ำ)
db.collection.update(
{ _id: ObjectId("...") },
{ $addToSet: { "products": { productId: "P001", name: "Product 1" } } }
);
หมายเหตุ: สำหรับ Object จะเช็ค Duplicate ทุกฟิลด์ ต้องตรงทุกฟิลด์จึงถือว่าซ้ำ