MongoDB中$unionWith能否在$push中使用及关联数据查询咨询
原语句报错核心原因:$unionWith属于聚合顶层阶段,不支持嵌套在$group的字段计算逻辑内使用,同时子查询中直接引用$field1/$field2也无法正确获取分组后的字段值。
可直接运行的正确聚合语句如下:
db.collectionA.aggregate([ // 过滤参与分组的文档:仅同时存在field1、field2的文档参与分组,可按需调整过滤规则 { $match: { field1: { $exists: true }, field2: { $exists: true } } }, // 按field1、field2分组,收集同组所有value { $group: { _id: { field1: "$field1", field2: "$field2" }, value: { $push: "$value" } } }, // 关联原集合查询符合条件的关联文档 { $lookup: { from: "collectionA", // 声明要传入子查询的分组字段变量 let: { groupF1: "$_id.field1", groupF2: "$_id.field2" }, pipeline: [ { $match: { $expr: { $or: [ // 匹配只有field1=分组field1的独立文档,可按需删除该判断条件 { $and: [ { $eq: ["$field1", "$$groupF1"] }, { $eq: [ { $type: "$field2" }, "missing" ] } ] }, // 匹配只有field2=分组field2的独立文档,可按需删除该判断条件 { $and: [ { $eq: ["$field2", "$$groupF2"] }, { $eq: [ { $type: "$field1" }, "missing" ] } ] } ] } } }, // 仅返回需要的value字段 { $project: { value: 1, _id: 0 } } ], as: "relatedTemp" } }, // 提取关联文档的value为一维数组 { $addFields: { relatedValue: { $map: { input: "$relatedTemp", in: "$$this.value" } } } }, // 移除临时字段 { $project: { relatedTemp: 0 } }, // 按需保留指定分组,示例中仅保留field1=1的分组,不需要可删除该阶段 { $match: { "_id.field1": 1 } } ])
执行后输出结果和你给出的预期格式完全一致。如果你不需要限制关联文档为仅含单个字段的独立文档,直接删除$match里的两个$and判断,仅保留$or下的$eq匹配规则即可。
内容的提问来源于stack exchange,提问作者Chicky
相关产品推荐
相关产品推荐

