如何修改MongoDB聚合管道从嵌套数组提取dishId生成dishIds字段
修改MongoDB聚合管道提取嵌套的dishId
完整聚合管道代码
[ { $match: { userId: mongoose.Types.ObjectId(userId) } }, { $project: { translations: 1 } }, { $lookup: { from: 'menus', localField: '_id', foreignField: 'restaurantId', as: 'menus' } }, // 提取所有嵌套的dishId并合并为一维数组 { $addFields: { dishIds: { $reduce: { input: "$menus", initialValue: [], in: { $concatArrays: [ "$$value", { $reduce: { input: "$$this.structure", initialValue: [], in: { $concatArrays: [ "$$value", { $map: { input: "$$this", as: "item", in: "$$item.dishId" } } ] } } } ] } } } } }, // 移除menus字段,保留目标字段 { $project: { translations: 1, dishIds: 1 } } ]
关键逻辑说明
- 第一层
$reduce:遍历menus数组,逐个处理每个菜单对象 - 第二层
$reduce:遍历当前菜单的structure二维数组,拆解嵌套层级 $map:从子数组的每个元素中提取dishId字段$concatArrays:把所有提取到的dishId数组合并为一个一维数组,赋值给dishIds- 最后一个
$project:移除不需要的menus字段,只保留_id、translations和dishIds
该管道会自动处理menus为空的情况,返回空的dishIds数组;当存在嵌套的dishId时,会将所有符合条件的ID提取并合并到目标数组中。
内容的提问来源于stack exchange,提问作者SeriousMonk
相关产品推荐
相关产品推荐

