ใช้ $lookup (Join) แทน UNION สำหรับรวมข้อมูลสองคอลเลกชัน
MongoDB ไม่มี UNION ตรงตัว แต่สามารถใช้ $lookup join สองคอลเลกชัน แล้ว aggregate รวมค่าได้
คอลเลกชัน demo486
> db.demo486.insertOne({ _id: 1, "Amount": 30, "No": 4 });
> db.demo486.insertOne({ _id: 2, "Amount": 40, "No": 2 });
> db.demo486.insertOne({ _id: 3, "Amount": 60, "No": 6 });
คอลเลกชัน demo487
> db.demo487.insertOne({ _id: 1, "Price": 10, "No": 4 });
> db.demo487.insertOne({ _id: 2, "Price": 80, "No": 9 });
> db.demo487.insertOne({ _id: 3, "Price": 20, "No": 6 });
Query Join และ Sum (คล้าย UNION + GROUP BY)
> db.getCollection('demo486').aggregate([
{ $lookup: { from: "demo487", localField: "No", foreignField: "No", as: "demo487" } },
{ $unwind: "$demo487" },
{ $group: {
_id: { No: "$No" },
TotalValue: { $sum: { $add: ["$Amount", "$demo487.Price"] } }
}},
{ $sort: { "_id.No": 1 } },
{ $project: { No: "$_id.No", TotalValue: 1, _id: 0 } }
]);
ผลลัพธ์
{ "TotalValue": 40, "No": 4 }
{ "TotalValue": 80, "No": 6 }
คำอธิบาย
- $lookup - Left join demo487 ด้วย field No
- $unwind - แปลงอาร์เรย์ demo487 เป็นออบเจ็กต์ (inner join behavior)
- $group - จัดกลุ่มตาม No, รวม Amount + Price
- $project - จัดรูปแบบ output
UNION จริง (Concatenate Results)
หากต้องการ UNION แบบต่อข้อมูลต่อกัน (ไม่ join) ใช้ $unionWith (MongoDB 4.4+):
db.demo486.aggregate([
{ $unionWith: "demo487" },
{ $group: { _id: "$No", TotalValue: { $sum: { $add: ["$Amount", "$Price"] } } } },
{ $project: { No: "$_id", TotalValue: 1, _id: 0 } }
]);
Application-level UNION
สำหรับ UNION แบบง่าย ควรทำใน Application Layer:
const results1 = db.demo486.find().toArray();
const results2 = db.demo487.find().toArray();
const union = [...results1, ...results2];