आप कोशिश कर सकते हैं,
$lookup
students
. के साथ संग्रह$project
आवश्यक फ़ील्ड दिखाने के लिए,$map
top10 सरणी के लूप को पुनरावृत्त करने के लिए और अंदर$reduce
. का उपयोग करें छात्रों से पूरा नाम प्राप्त करने और$mergeObjects
. का उपयोग करके शीर्ष 10 ऑब्जेक्ट के साथ विलय करने के लिए
db.exams.aggregate([
{
$lookup: {
from: "students",
localField: "top10.studentId",
foreignField: "_id",
as: "students"
}
},
{
$project: {
test: 1,
students: {
$map: {
input: "$top10",
as: "top10",
in: {
$mergeObjects: [
"$$top10",
{
fullname: {
$reduce: {
input: "$students",
initialValue: 0,
in: {
$cond: [
{ $eq: ["$$this._id", "$$top10.studentId"] },
"$$this.fullname",
"$$value"
]
}
}
}
}
]
}
}
}
}
}
])
दूसरा विकल्प जिसका आप उपयोग कर सकते हैं $unwind
$lookup
. से पहले ,
$unwind
डीकंस्ट्रक्टtop10
सरणी$lookup
students
. के साथ संग्रह$addFields
$arrayElemtAt
. का उपयोग करके छात्र सरणी को ऑब्जेक्ट में बदलने के लिए$group
_id द्वारा और छात्रों की सरणी का निर्माण करें और आवश्यक फ़ील्ड को पुश करें
db.exams.aggregate([
{ $unwind: "$top10" },
{
$lookup: {
from: "students",
localField: "top10.studentId",
foreignField: "_id",
as: "students"
}
},
{ $addFields: { students: { $arrayElemAt: ["$students", 0] } } },
{
$group: {
_id: "$_id",
test: { $first: "$test" },
students: {
$push: {
studentId: "$top10.studentId",
score: "$top10.score",
fullname: "$students.fullname"
}
}
}
}
])