เมื่อต้องการเพิ่มค่าเข้าไปในอาร์เรย์ที่อยู่ภายในอาร์เรย์ (nested array) โดยไม่ให้ซ้ำ ให้ใช้ update() ร่วมกับโอเปอเรเตอร์ $addToSet โอเปอเรเตอร์นี้จะเพิ่มค่าเข้าไปก็ต่อเมื่อค่านั้นยังไม่มีอยู่ในอาร์เรย์
> db.demo509.insertOne({
... "value1": [
... { "value2": [ 76, 14, 56 ] },
... { "value2": [ 12, 19, 91 ] },
... { "value2": [ 87 ] }
... ]
... });
{ "acknowledged" : true, "insertedId" : ObjectId("5e88421d987b6e0e9d18f57d") }
แสดงข้อมูล:
> db.demo509.find();
{ "_id" : ObjectId("5e88421d987b6e0e9d18f57d"), "value1" : [ { "value2" : [ 76, 14, 56 ] }, { "value2" : [ 12, 19, 91 ] }, { "value2" : [ 87 ] } ] }
คิวรีเพิ่มค่า 1000 เข้าไปในอาร์เรย์ที่ 3 (index 2)
> db.demo509.update({}, {$addToSet: {"value1.2.value2": 1000}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
ตรวจสอบผลลัพธ์:
> db.demo509.find();
{ "_id" : ObjectId("5e88421d987b6e0e9d18f57d"), "value1" : [ { "value2" : [ 76, 14, 56 ] }, { "value2" : [ 12, 19, 91 ] }, { "value2" : [ 87, 1000 ] } ] }
จุดสำคัญ
- ใช้ dot notation ระบุตำแหน่ง:
value1.2.value2(index 2 = อาร์เรย์ตัวที่ 3) $addToSetจะไม่เพิ่มค่าซ้ำ - ถ้ารันคิวรีเดิมอีกครั้ง ค่า 1000 จะไม่ถูกเพิ่มเข้าไปอีก- เหมาะสำหรับการจัดการ tags, categories, หรือรายการที่ต้องไม่ซ้ำกัน