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

MongoDB聚合管道中如何同时实现并集与交集操作

实现(query_a UNION query_b) INTERSECTION query_c的MongoDB聚合管道修改方案

要在现有聚合管道的query_a与query_b并集结果基础上,实现和query_c的ID交集(即(query_a UNION query_b) INTERSECTION query_c),可按以下方式修改管道:

修改后的聚合管道代码

[
  {
    "$project": {
      "union": { "$setUnion": ["$query_a", "$query_b"] },
      // 提取query_c中的所有ID,用于后续交集判断
      "query_c_ids": { "$map": { "input": "$query_c", "as": "item", "in": "$$item.ID" } }
    }
  },
  { "$unwind": "$union" },
  {
    "$group": {
      "_id": "$union.ID",
      "date_a": { "$addToSet": "$union.date_a" },
      "date_b": { "$addToSet": "$union.date_b" },
      // 保留query_c_ids到分组阶段
      "query_c_ids": { "$first": "$query_c_ids" }
    }
  },
  // 筛选出存在于query_c_ids中的ID,完成交集操作
  { "$match": { "_id": { "$in": "$query_c_ids" } } },
  { "$unwind": "$date_a" },
  { "$unwind": "$date_b" },
  {
    "$project": {
      "_id": 1,
      "date_a": "$date_a",
      "date_b": "$date_b",
      "diff": {
        "$subtract": [ { "$toInt": "$date_b" }, { "$toInt": "$date_a" } ]
      }
    }
  },
  { "$match": { "diff": { "$gt": 0, "$lte": 20 } } },
  // 转换为期望的输出格式,只保留ID字段
  { "$project": { "ID": "$_id", "_id": 0 } }
]

关键修改说明

  • 提取query_c的ID集合:在初始$project阶段,通过$map从query_c字段中提取所有ID,生成query_c_ids数组。
  • 保留query_c_ids到分组阶段:在$group阶段使用$first保留query_c_ids,确保后续能进行交集判断。
  • 执行交集过滤:添加$match阶段,筛选出_id(即并集中的ID)存在于query_c_ids中的文档,完成核心交集逻辑。
  • 调整输出格式:最后通过$project将_id重命名为ID并移除原_id字段,匹配期望输出结构。

期望输出示例

[
  {
    "ID": "c80ea2cb-3272-77ae-8f46-d95de600c5bf"
  },
  {
    "ID": "cdbcc129-548a-9d51-895a-1538200664e6"
  }
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:40:43