ใช้ $lookup ร่วมกับ $redact สำหรับการ Join แบบมีเงื่อนไข
เมื่อต้องการ join สองคอลเลกชันและกรองเฉพาะเอกสารที่ฟิลด์หนึ่งมีค่ามากกว่าฟิลด์ในอีกคอลเลกชัน ใช้ $lookup + $unwind + $redact
คอลเลกชันแรก: demo446
> db.demo446.insert([{ "ProductName": "Product1", "ProductPrice": 60 }, { "ProductName": "Product2", "ProductPrice": 90 }]);
คอลเลกชันที่สอง: demo447
> db.demo447.insert([{ "ProductName": "Product1", "ProductPrice": 40 }, { "ProductName": "Product2", "ProductPrice": 70 }]);
Query Join และกรอง ProductPrice ของ demo446 > (demo447.ProductPrice * rate + 3)
> var rate = 1;
> db.demo446.aggregate([
{ $match: { ProductPrice: { $exists: true }, ProductName: { $exists: true } } },
{ $lookup: { from: "demo447", localField: "ProductName", foreignField: "ProductName", as: "demo447" } },
{ $unwind: "$demo447" },
{ $redact: {
$cond: [
{ $gt: ["$ProductPrice", { $add: [{ $multiply: ["$demo447.ProductPrice", rate] }, 3] } ] },
"$$KEEP",
"$$PRUNE"
]
}}
]);
ผลลัพธ์
{ "_id": ObjectId(...), "ProductName": "Product1", "ProductPrice": 60, "demo447": { "_id": ObjectId(...), "ProductName": "Product1", "ProductPrice": 40 } }
{ "_id": ObjectId(...), "ProductName": "Product2", "ProductPrice": 90, "demo447": { "_id": ObjectId(...), "ProductName": "Product2", "ProductPrice": 70 } }
คำอธิบาย
- $lookup - Join คอลเลกชัน demo447 ด้วย ProductName
- $unwind - แปลงอาร์เรย์ demo447 เป็นออบเจ็กต์เดี่ยว
- $redact - กรองเอกสารแบบ recursive ตามเงื่อนไข $$KEEP/$$PRUNE
- $cond - เงื่อนไข: ProductPrice > (demo447.ProductPrice * rate + 3)
หมายเหตุ
$redact เหมาะสำหรับการกรองที่ซับซ้อน แต่อาจช้ากว่า $match ในบางกรณี สำหรับกรณีง่ายๆ ควรพิจารณาใช้ $match หลัง $unwind แทน