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

วิธีรวมสองคอลเลกชันใน MongoDB โดยเปรียบเทียบฟิลด์จากคอลเลกชันหนึ่งมากกว่าอีกคอลเลกชัน


ใช้ $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 แทน