MongoDB关联集合学生ID合并为单数组的聚合查询问题
修正MongoDB聚合查询,合并关联的学生数组
我来帮你调整这个聚合查询,让它输出你期望的合并后单一数组结果~
首先,咱们先分析下当前查询的问题:$lookup之后得到的GroupDetails是一个包含多个Subjects文档的数组,每个文档里又嵌套了members.student数组,所以最终结果是嵌套的数组结构。咱们需要把这些分散的学生数组合并成一个扁平的数组。
修正后的聚合查询
db.Colleges.aggregate([ // 筛选目标学院,这一步保留不变 { $match : { "clgID" : { $in : ["100", "200"] } } }, // 关联Subjects集合,这一步也保留不变 { $lookup: { from: "Subjects", localField: "clgID", foreignField: "college.collegeID", as: "GroupDetails" } }, // 关键修正:用$reduce和$concatArrays合并所有学生数组 { $project: { _id: false, clgName: "$name", GroupDetails: { $reduce: { input: "$GroupDetails", // 遍历lookup得到的Subjects数组 initialValue: [], // 初始累加器是空数组 in: { $concatArrays: ["$$value", "$$this.members.student"] } // 把当前文档的student数组和累加器合并 } } } } ])
代码解释
$reduce会遍历$lookup返回的GroupDetails数组,每次迭代都将当前Subject文档中的members.student数组与累加器($$value)合并。- 对于没有关联任何Subject的“National”学院,
$reduce会保持初始的空数组,完全符合你的期望输出。
最终输出结果
{ "GroupDetails" : [], "clgName" : "National" }, { "GroupDetails" : [ "123", "456", "789" ], "clgName" : "Anna University" }
内容的提问来源于stack exchange,提问作者Bhuvan M
相关产品推荐
相关产品推荐

