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

MongoDB多集合关联:按匹配id关联news和newscategory集合的实现方法

MongoDB多集合关联实现方案

MongoDB完全支持多集合关联操作,针对你的需求可以通过**聚合管道(Aggregation Pipeline)**结合$lookup关联阶段实现,具体操作如下:


核心实现代码

你需要对news集合执行聚合查询,分阶段处理数据,最终得到符合预期的输出:

db.news.aggregate([
  // 1. 展开news数组,将每条新闻拆分为独立文档方便处理
  { $unwind: "$news" },
  // 2. 关联newscategory集合,匹配对应分类
  {
    $lookup: {
      from: "newscategory",
      let: { catId: "$news.categoryId", newsLang: "$lang" },
      pipeline: [
        // 先匹配相同语言,缩小查询范围提升效率
        { $match: { $expr: { $eq: ["$lang", "$$newsLang"] } } },
        // 过滤出ID匹配的分类项
        {
          $project: {
            _id: 0,
            category: {
              $filter: {
                input: "$categories",
                cond: { $eq: ["$$this._id", "$$catId"] }
              }
            }
          }
        },
        { $unwind: "$category" },
        // 仅保留分类本身的字段作为返回结果
        { $replaceRoot: { newRoot: "$category" } }
      ],
      as: "news.category" // 你预期输出中的caregory为拼写错误,若需要保留错误命名可修改为"news.caregory"
    }
  },
  // 3. 转换ObjectId、日期类型为字符串,匹配预期输出格式
  {
    $addFields: {
      "news.categoryId": { $toString: "$news.categoryId" },
      "news.createdAt": { $dateToString: { date: "$news.createdAt" } },
      "news._id": { $toString: "$news._id" },
      "news.category._id": { $toString: "$news.category._id" }
    }
  },
  // 4. 重新合并news数组,恢复原文档结构
  {
    $group: {
      _id: { $toString: "$_id" },
      lang: { $first: "$lang" },
      news: { $push: "$news" }
    }
  }
])

补充说明

  • 如果不需要按语言匹配分类,可以直接删除$lookup管道中对应$match阶段
  • 如果你使用的是MongoDB 5.0以上版本,也可以配合$lookup的localField和foreignField参数结合$unwind实现,性能差异不大
  • 上述代码返回的结构和你给出的预期输出完全一致,仅修正了分类字段的拼写错误,如有特殊需求可以自行调整字段名

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:39:00