MongoDB 4.4 的 $unionWith 仅支持字符串集合名,不支持 pipeline 参数;字段需提前用 $project 统一,合并后顺序不可控,须显式 $sort;Java 中需手写 Document 调用。
MongoDB 4.4 确实引入了 $unionWith,但它只接受字符串形式的集合名,比如 {$unionWith: "admins"},**不支持 pipeline 字段**。这是和 5.0+ 最关键的区别——4.4 的 $unionWith 没有 pipeline 选项,所以无法在联合时对目标集合做 $match、$project 等预处理。
常见错误是直接照搬 5.0+ 写法,比如:
{$unionWith: { coll: "admins", pipeline: [{$match: {active: true}}] }}
这在 4.4 会报错:unrecognized field 'pipeline'。
{$unionWith: "targetCollection"}
$match/$project 阶段(不能嵌套在 $unionWith 里)null,而是直接不出现——容易导致后续 $group 或 $sum 出错如果 orders 和 returns 集合字段不同(比如前者有 amount,后者是 refund),直接 $unionWith 后字段会错乱。必须用 $project 统一输出结构。
正确做法是:在每个集合的数据流里先做字段映射,再 union。
$project,把字段重命名为统一别名,如 {value: "$amount"}
$unionWith: "returns",但注意:4.4 不允许给 returns 单独加 pipeline,所以得提前建视图或改写查询逻辑db.createView("unified_events", "orders", [{$project: {type: "order", value: "$amount", ts: "$createdAt"}}]),再对 returns 做同样视图,最后查视图并 union$unionWith 在 4.4 中默认不去重,这点和 SQL 的 UNION ALL 行为一致,但**顺序完全不可控**——即使两个集合各自有序,合并后文档顺序是随机的。
_id 排序隐含保证logs_202401 + logs_202402),必须在 $unionWith 后显式加 $sort,例如 {$sort: {timestamp: 1}}
Sort exceeded memory limit
$skip/$limit 更快更稳MongoTemplate 4.x(对应 MongoDB 4.4)没有封装 $unionWith 的 Criteria 方法,必须用原生 BSON 构造。
Aggregation.newAggregation(...) 直接链式调用 $unionWith
Document: new Document("$unionWith", "admins")
Aggregation.aggregate(..., new Document(...)) 方式传入Map 可能缺少某些 key,建议用 @Document 类定义统一 DTO,配合 $project 显式映射字段真正麻烦的不是语法,而是字段对齐和顺序控制——这些在 4.4 里都得靠组合阶段硬扛,没法像 5.0+ 那样用 pipeline: [] 一键保底。
克里斯托弗·诺兰作品《致命魔术》将重返影院
TP-Link Deco 7 Pro BE10000 Wi-Fi 7 全屋 Mesh 系统 6.4 折优惠现享
《自由足球怀旧服》大乱斗模式开启:强势中场登场:S3赛季任务及奖励重磅更新!
网易冷兵器新作《诡影藏锋》实机首曝:女鬼魅惑,恐怖拉满
炉石传说: Escape from Violet Hold 今日上线——探索游戏背后的人生哲理
亚马逊开启精选 4K 铁盒版促销:《回到未来》《侏罗纪世界》三部曲等作品迎来优惠