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

如何在MongoDB单聚合管道中查询多集合实现SQL UNION SELECT效果

MongoDB实现多集合UNION统计的方案

你可以通过在$unionWith中嵌套独立子管道的方式实现需求,全程不会合并三个集合的原始无关联数据,只会聚合返回最终的统计结果,和MySQL的UNION SELECT效果完全一致,具体实现如下:

聚合查询语句

db.car_data.aggregate([
  // 统计Car类平均成本
  {
    $group: {
      _id: null,
      Cost: { $avg: "$msrp" }
    }
  },
  // 新增类型标识
  {
    $addFields: { Type: "Car" }
  },
  // 合并船舶类统计结果
  {
    $unionWith: {
      coll: "boat_data",
      pipeline: [
        { $group: { _id: null, Cost: { $avg: "$assesment" } } },
        { $addFields: { Type: "Boat" } }
      ]
    }
  },
  // 合并自行车类统计结果
  {
    $unionWith: {
      coll: "bike_data",
      pipeline: [
        { $group: { _id: null, Cost: { $avg: "$stickerPrice" } } },
        { $addFields: { Type: "Bike" } }
      ]
    }
  },
  // 调整输出字段格式
  {
    $project: {
      _id: 0,
      Type: 1,
      Cost: 1
    }
  },
  // 可选:添加金额格式化逻辑,输出和示例一致的带千分位的格式
  {
    $set: {
      Cost: {
        $function: {
          body: function(num) {
            return Math.round(num).toLocaleString('en-US')
          },
          args: ["$Cost"],
          lang: "js"
        }
      }
    }
  }
])

方案说明

  • 每个集合的统计逻辑都在独立的子管道内完成,运行时仅会返回每个集合的1条统计结果,不会拉取合并三个集合的原始业务数据,完全符合你不希望合并无关数据的要求
  • 输出结果为3条独立文档,结构和你给出的MySQL UNION查询结果完全匹配
  • 如果不需要千分位格式化,删除最后一个$set阶段即可,返回的Cost为数值型平均结果

低版本兼容方案

如果你使用的MongoDB版本低于4.4(不支持$unionWith操作符),可以分别对三个集合执行独立的聚合查询,在应用层合并三次的统计结果即可,逻辑和上述方案完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:39:01