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

MongoDB聚合查询中使用lookup关联比较集合与数组数据的实现方案

这个需求完全可以通过MongoDB的聚合框架实现,具体实现步骤和代码如下:


核心实现逻辑

  1. 匹配chat集合中id为test1的目标文档
  2. 对tags数组做去重处理,生成setTags字段
  3. 通过带let和pipeline的$lookup关联tag集合,筛选出key属于去重后tags的所有标签文档
  4. 调整输出结构匹配要求的返回格式

完整聚合查询代码

db.chat.aggregate([
  // 匹配id为test1的chat文档
  {
    $match: {
      id: "test1"
    }
  },
  // 对tags数组去重生成setTags字段
  {
    $addFields: {
      setTags: {
        $setUnion: ["$tags", []]
      }
    }
  },
  // 关联tag集合,筛选匹配的标签文档
  {
    $lookup: {
      from: "tag",
      let: { tagKeys: "$setTags" },
      pipeline: [
        {
          $match: {
            $expr: {
              $in: ["$key", "$$tagKeys"]
            }
          }
        }
      ],
      as: "tagList"
    }
  },
  // 调整输出结构为期望格式
  {
    $project: {
      _id: 0,
      chat: [
        {
          id: "$id",
          setTags: "$setTags"
        }
      ],
      tag: "$tagList"
    }
  }
])

代码说明

  • $setUnion操作符会自动对数组元素去重,无需额外分组操作,执行效率更高
  • $lookup中通过let把当前chat文档的去重标签列表传入子管道,用$expr结合$in筛选出所有匹配的tag文档
  • 最终$project阶段按照要求组装返回结构,和你给出的期望返回示例完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 17:24:03