You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 23:36:17