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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:57:02