如何关联MongoDB多个Collection,按启用分类返回含完整Item的Package列表
实现方案
直接在Category集合上执行以下MongoDB聚合查询即可得到符合要求的返回结果:
db.category.aggregate([ // 筛选status为true的有效分类 { $match: { status: true } }, // 关联查询对应分类下的所有Package数据 { $lookup: { from: "package", localField: "id", foreignField: "categoryId", as: "package" } }, // 拆分package数组便于单独处理每个套餐的item关联 { $unwind: "$package" }, // 关联Item集合补全每个package的items完整信息 { $lookup: { from: "item", localField: "package.items.itemId", foreignField: "id", as: "package.items" } }, // 将拆分的package重新合并为数组 { $group: { _id: "$_id", name: { $first: "$name" }, status: { $first: "$status" }, package: { $push: "$package" } } }, // 移除不需要的默认_id字段,适配预期输出结构 { $project: { _id: 0 } } ])
逻辑说明
$match阶段先过滤出符合条件的分类,降低后续计算量- 第一次
$lookup通过分类id关联Package集合,拿到对应分类下的所有套餐数据 $unwind将package数组拆分为单条文档,方便对每个套餐单独处理item关联逻辑- 第二次
$lookup直接传入当前套餐所有item的itemId数组,批量匹配Item集合拿到完整Item对象,直接替换原有items字段 $group阶段按分类id分组,把拆分的套餐文档重新合并为数组- 最后
$project阶段剔除MongoDB默认生成的内部_id字段,输出结构完全匹配预期
内容的提问来源于stack exchange,提问作者Sufail Kalathil
相关产品推荐
相关产品推荐

