Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

MongoDB Aggregate $lookup join mảng với collection khác

Để join dữ liệu từ mảng trong collection này sang collection khác, dùng $unwind tách mảng, sau đó $lookup để join, cuối cùng $group gom lại.

Collection 1: demo101 (chứa mảng Details.PId)

> db.demo101.insertOne({ "_id" : "1", "Details" : [ { "PId" : "200" }, { "PId" : "201" }, { "PId" : "201" } ] });
{ "acknowledged" : true, "insertedId" : "1" }

Collection 2: demo102 (thông tin chi tiết)

> db.demo102.insertOne({ "_id" : "201", "CustEmailId" : "Carol@gmail.com" });
{ "acknowledged" : true, "insertedId" : "201" }
// Giả sử đã có _id="200" với email John@gmail.com

Pipeline aggregate join

> db.demo101.aggregate([
    { $unwind: "$Details" },
    { $lookup: { 
        from: "demo102", 
        localField: "Details.PId", 
        foreignField: "_id", 
        as: "out" 
    }},
    { $project: { 
        "_id": 1, 
        "Details.PId": { $arrayElemAt: ["$out.CustEmailId", 0] } 
    }},
    { $group: { 
        _id: "$_id", 
        Details: { $push: "$Details" } 
    }}
]).pretty()

Kết quả

{ "_id" : "1", "Details" : [ { "PId" : "John@gmail.com" }, { "PId" : "Carol@gmail.com" }, { "PId" : "Carol@gmail.com" } ] }

Giải thích:

  1. $unwind: Tách mảng Details thành các document riêng (3 doc từ 1 doc gốc)
  2. $lookup: Left join với demo102 trên PId = _id, kết quả trong mảng out
  3. $project: Lấy email đầu tiên của mảng out (vì lookup trả về mảng)
  4. $group: Gom lại theo _id gốc, push Details thành mảng

Đây là pattern chuẩn để "join" mảng với collection khác trong MongoDB.