MongoDB复杂聚合:关联Schema并实现数组及总计计算
MongoDB聚合实现方案
直接用$map处理数组元素,避免$unwind后再重组的麻烦,完整聚合管道如下:
db.b.aggregate([ // 关联Schema a,获取academic_year { $lookup: { from: "a", localField: "b4", foreignField: "_id", as: "a_data" } }, // 提取academic_year并给b3数组元素添加total字段 { $addFields: { academic_year: { $arrayElemAt: ["$a_data.academic_year", 0] }, b3: { $map: { input: "$b3", as: "item", in: { b3_1: "$$item.b3_1", b3_2: "$$item.b3_2", b3_3: "$$item.b3_3", total: { $add: ["$$item.b3_1", "$$item.b3_2", "$$item.b3_3"] } } } } } }, // 计算BigTotal:b1 + b2 + 所有b3元素的total之和 { $addFields: { BigTotal: { $add: [ "$b1", "$b2", { $sum: { $map: { input: "$b3", as: "item", in: "$$item.total" } } } ] } } }, // 移除冗余字段(可选) { $project: { a_data: 0, b4: 0 } } ])
步骤说明:
- $lookup:将b集合的
b4字段与a集合的_id关联,拉取对应的学年数据。 - 第一个$addFields:用
$arrayElemAt提取关联后的学年值;用$map遍历b3数组,给每个元素新增total字段(为三个子字段的和)。 - 第二个$addFields:先通过
$map提取所有b3元素的total值,再用$sum求和,最后加上b1和b2得到BigTotal。 - $project:移除关联产生的临时数组
a_data和原b4字段,让结果结构更简洁。
这个方案全程无需拆分数组,直接在数组层面完成计算,避免了$unwind后重组的复杂操作,效率更高。
内容的提问来源于stack exchange,提问作者Genti
相关产品推荐
相关产品推荐

