บทความนี้สาธิตการใช้ $setUnion ใน Aggregation Pipeline เพื่อรวม (Merge) Array สองฟิลด์ให้กลายเป็น Array เดียวที่มีค่าไม่ซ้ำกัน (Unique Values)
สร้างข้อมูลตัวอย่าง
> db.mergeTwoArrayFieldDemo.insertOne({"NaturalNumbers":[1,2,3,8,10,20,30],"WholeNumbers":[0,1,2,63,78,20,45]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd68e4057806ebf1256f11d") }
แสดงข้อมูลต้นฉบับ
> db.mergeTwoArrayFieldDemo.find().pretty();
{
"_id" : ObjectId("5cd68e4057806ebf1256f11d"),
"NaturalNumbers" : [ 1, 2, 3, 8, 10, 20, 30 ],
"WholeNumbers" : [ 0, 1, 2, 63, 78, 20, 45 ]
}
รวม Array ทั้งสองด้วย $setUnion
> db.mergeTwoArrayFieldDemo.aggregate([
{ "$project": {
"MergedArray": { "$setUnion": [ "$NaturalNumbers", "$WholeNumbers" ] }
}}
]);
ผลลัพธ์ (เรียงจากน้อยไปมาก อัตโนมัติ)
{ "_id" : ObjectId("5cd68e4057806ebf1256f11d"), "MergedArray" : [ 0, 1, 2, 3, 8, 10, 20, 30, 45, 63, 78 ] }
คำอธิบาย $setUnion
- รับ Array 2 ตัวขึ้นไป เป็น Argument
- คืนค่า Array ที่รวมค่า ไม่ซ้ำกัน (Set Union)
- ผลลัพธ์ถูก เรียงลำดับอัตโนมัติ (Ascending)
- ทำงานกับ Primitive Values (Number, String, Boolean)
Array Set Operators อื่นๆ ใน Aggregation
| Operator | คำอธิบาย | ตัวอย่างผลลัพธ์ |
|---|---|---|
$setUnion | รวมทั้งหมด ไม่ซ้ำ (Union) | [1,2] U [2,3] = [1,2,3] |
$setIntersection | ค่าที่มีในทุก Array (Intersection) | [1,2] ∩ [2,3] = [2] |
$setDifference | ค่าใน Array แรก แต่ไม่ใน Array ที่สอง | [1,2] - [2,3] = [1] |
$setIsSubset | เช็คว่า Array แรกเป็น Subset ของ Array ที่สอง | [1,2] ⊆ [1,2,3] = true |
$setEquals | เช็คว่า Array ทั้งสองมีค่าเท่ากันหมด (ไม่สนใจ Order) | [1,2] = [2,1] = true |