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

Implement Query คล้าย MySQL UNION ใน MongoDB


ใช้ $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];