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

เพิ่ม Element เข้า Array ที่มีอยู่แล้วใน MongoDB ด้วย $addToSet

บทความนี้สาธิตการใช้ 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 ทุกฟิลด์ ต้องตรงทุกฟิลด์จึงถือว่าซ้ำ