จัดรูปแบบผลลัพธ์เป็นอาร์เรย์ค่าไม่ซ้ำด้วย $addToSet
บทความนี้สาธิตการใช้ Aggregation Pipeline พร้อม $group และ $addToSet เพื่อรวมค่าของฟิลด์จากหลายเอกสารเป็นอาร์เรย์เดียวที่ไม่มีค่าซ้ำ (Unique Values) และจัดรูปแบบเอาต์พุตด้วย $project
ขั้นตอนที่ 1: สร้าง Collection และเพิ่มข้อมูลตัวอย่าง
> db.demo207.insertOne({"FavouriteTechnology":"Spring Boot"});
{ "acknowledged": true, "insertedId": ObjectId("5e3d8e7a03d395bdc21346f1") }
> db.demo207.insertOne({"FavouriteTechnology":"MongoDB"});
{ "acknowledged": true, "insertedId": ObjectId("5e3d8e8f03d395bdc21346f2") }
> db.demo207.insertOne({"FavouriteTechnology":"Groovy"});
{ "acknowledged": true, "insertedId": ObjectId("5e3d8ea603d395bdc21346f3") }
ขั้นตอนที่ 2: แสดงข้อมูลทั้งหมด
> db.demo207.find();
ผลลัพธ์:
{ "_id": ObjectId("5e3d8e7a03d395bdc21346f1"), "FavouriteTechnology": "Spring Boot" }
{ "_id": ObjectId("5e3d8e8f03d395bdc21346f2"), "FavouriteTechnology": "MongoDB" }
{ "_id": ObjectId("5e3d8ea603d395bdc21346f3"), "FavouriteTechnology": "Groovy" }
ขั้นตอนที่ 3: Aggregation Pipeline รวมค่าไม่ซ้ำ
$group- จัดกลุ่มทั้งหมด (_id: 0) และใช้$addToSetรวมFavouriteTechnologyเป็นอาร์เรย์ไม่ซ้ำ$project- ซ่อน _id แสดงเฉพาะ FavouriteTechnology
> db.demo207.aggregate([
{ "$group": {
"_id": 0,
"FavouriteTechnology": { "$addToSet": "$FavouriteTechnology" }
}},
{ "$project": { "_id": 0, "FavouriteTechnology": 1 } }
]);
ผลลัพธ์ที่ได้
{ "FavouriteTechnology": ["MongoDB", "Groovy", "Spring Boot"] }
สรุป: $addToSet คล้าย $push แต่จะเพิ่มค่าเข้าไปในอาร์เรย์ก็ต่อเมื่อค่านั้นยังไม่มีอยู่แล้ว (Unique) เหมาะสำหรับการสร้างรายการค่าที่ไม่ซ้ำกันจากหลายเอกสาร