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
相关产品推荐
相关产品推荐

