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

