Để 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:
$unwind: Tách mảng Details thành các document riêng (3 doc từ 1 doc gốc)$lookup: Left join với demo102 trên PId = _id, kết quả trong mảngout$project: Lấy email đầu tiên của mảng out (vì lookup trả về mảng)$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.