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

MongoDB数组对象字段group by聚合 数组合并问题求助

问题原因

原聚合逻辑的错误出在$group阶段:你把seatSeletion数组整体设为了分组键的一部分,MongoDB会将分组键完全一致的文档归为同一组,不同订单的选座内容不同,自然会被拆成独立分组;同时原逻辑没有做数组内容的合并操作,只是把分组键里的选座数组原封不动返回,根本没有实现同场次选座合并的效果。

修正后的聚合代码
Bookings.aggregate([
  {
    $match: {
      $and: [
        { movieId: ObjectId(bookingParam.movieId) },
        { movieTiming: bookingParam.movieTiming },
        { movieDate: dateQuery }
      ]
    }
  },
  // 拆分每条订单的选座数组,将单个座位转为独立文档,避免后续合并出现嵌套数组
  { $unwind: "$seatSeletion" },
  {
    $group: {
      _id: {
        movieId: "$movieId",
        movieDate: "$movieDate",
        movieTiming: "$movieTiming"
        // 同场次下值固定的公共字段可以按需加到分组键中,比如createdBy、updatedBy
      },
      seatSeletion: {
        $push: {
          // 需要给单个座位关联所属订单ID的话,取消下面这行注释即可
          // orderId: "$_id",
          rowNo: "$seatSeletion.rowNo",
          columnNo: "$seatSeletion.columnNo",
          seatNo: "$seatSeletion.seatNo"
        }
      }
    }
  },
  {
    $project: {
      _id: 0,
      movieId: "$_id.movieId",
      movieDate: "$_id.movieDate",
      movieTiming: "$_id.movieTiming",
      seatSeletion: 1
    }
  }
])
核心修改说明
  • 分组键仅保留movieId、movieDate、movieTiming三个场次维度字段,移除了会导致分组拆分的seatSeletion字段
  • 新增$unwind阶段打散嵌套的选座数组,解决直接$push数组会产生二维数组的问题
  • 分组阶段通过$push累加器收集所有拆分后的单条座位数据,自动合并同场次下所有订单的选座到同一个数组中,完全匹配预期的输出结构。

内容的提问来源于stack exchange,提问作者Vinoth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:18:19