Bạn có thể sử dụng đường ống tổng hợp bên dưới.
$ lookup để điền đại lý, sau đó là $ Reduce và $ concatArrays để thu thập tất cả id khách hàng và $ lookup để lấy thông tin chi tiết về khách hàng.
$ addFields với $ map để lặp lại mảng nhiệm vụ và đối với mỗi khách hàng ánh xạ thông tin khách hàng từ giai đoạn trước bằng cách tra cứu theo id khách hàng và $ mergeObjects để giữ các trường khác. giai đoạn $ project để loại bỏ các trường thừa.
Mongo db 3.6 trở lên
Model.aggregate([
{"$lookup":{
"from":"agents",
"localField":"agent",
"foreignField":"_id",
"as":"agent"
}},
{"$addFields":{"agent":{"$arrayElemAt":["$agent",0]}}},
{"$addFields":{
"client_ids":{
"$reduce":{
"input":"$missions",
"initialValue":[],
"in": {"$concatArrays":["$$value","$$this.clients.client"]}
}
}
}},
{"$lookup":{
"from":"clients",
"localField":"client_ids",
"foreignField":"_id",
"as":"client_info"
}},
{"$addFields":{
"missions":{
"$map":{
"input":"$missions",
"in":{
"$mergeObjects":[
"$$this",
{"clients":{"$map":{
"input":"$$this.clients",
"in":{"$mergeObjects":[
"$$this",
{"client":{"$arrayElemAt":[
"$client_info",
{"$indexOfArray":["$client_ids","$$this._id"]}
]}}
]}
}}}
]
}
}
}
}},
{"$project":{"client_ids":0,"client_info":0}}
])
Mongo db nhỏ hơn 3,6
$ lookup để điền đại lý, sau đó $ unwind để tiếp cận khách hàng và tra cứu để lấy thông tin chi tiết về khách hàng. Tua lại với $ group để đưa trở lại cấu trúc ban đầu với các giá trị đã phổ biến.
Model.aggregate([
{"$lookup":{
"from":"agents",
"localField":"agent",
"foreignField":"_id",
"as":"agent"
}},
{"$addFields":{"agent":{"$arrayElemAt":["$agent",0]}}},
{"$unwind":"$missions"},
{"$unwind":"$missions.clients"},
{"$lookup":{
"from":"clients",
"localField":"missions.clients.client",
"foreignField":"_id",
"as":"missions.clients.client"
}},
{"$addFields":{"missions.clients.client":{"$arrayElemAt":["$missions.clients.client",0]}}},
{"$group":{
"_id":{"_id":"$_id","mission_id":"$missions._id"},
"agent":{"$first":"$agent"},
"title":{"$first":"$missions.title"},
"clients":{"$push":"$missions.clients"}
}},
{"$group":{
"_id":"$_id._id",
"agent":{"$first":"$agent"},
"missions":{
"$push":{
"_id":"$_id.mission_id",
"title":"$title",
"clients":"$clients"
}
}
}}
])