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

MongoDB聚合中拼接多表lookup数据生成complete_slug字段的方法

解决方案:MongoDB聚合中新增拼接slug字段

要在已有的聚合查询中添加complete_slug字段,只需在所有$lookup及对应的$unwind阶段之后,新增一个$addFields阶段,利用$concat操作符拼接三个slug值即可。

完善后的完整聚合查询

db.stories.aggregate([
  // 关联category集合并展开数组
  {
    $lookup: {
      from: "categories",
      localField: "category_id",
      foreignField: "_id",
      as: "category"
    }
  },
  { $unwind: "$category" },
  
  // 关联subcategory集合并展开数组
  {
    $lookup: {
      from: "subcategories",
      localField: "subcategory_id",
      foreignField: "_id",
      as: "subcategory"
    }
  },
  { $unwind: "$subcategory" },
  
  // 关联stickers集合
  {
    $lookup: {
      from: "stickers",
      localField: "sticker_ids",
      foreignField: "_id",
      as: "stickers"
    }
  },
  
  // 关联prefixes集合并展开数组
  {
    $lookup: {
      from: "prefixes",
      localField: "prefix_id",
      foreignField: "_id",
      as: "prefix"
    }
  },
  { $unwind: "$prefix" },
  
  // 新增complete_slug字段
  {
    $addFields: {
      complete_slug: {
        $concat: [
          "$category.slug",
          "/",
          "$subcategory.slug",
          "/",
          "$slug"
        ]
      }
    }
  }
])

关键说明

  1. 必须展开关联数组:因为$lookup返回的是数组类型结果,所以必须用$unwind将category和subcategory数组展开为单个对象,否则无法直接访问category.slug和subcategory.slug字段。
  2. 空值处理(可选):如果存在关联数据可能为空的场景,可以用$ifNull避免拼接失败,示例如下:
    complete_slug: {
      $concat: [
        { $ifNull: ["$category.slug", ""] },
        "/",
        { $ifNull: ["$subcategory.slug", ""] },
        "/",
        { $ifNull: ["$slug", ""] }
      ]
    }
    

效果对比

  • 当前返回结果(无complete_slug):
    {
      "_id": ObjectId("1"),
      "slug": "my-story",
      "category": { "_id": ObjectId("cat1"), "slug": "tech" },
      "subcategory": { "_id": ObjectId("subcat1"), "slug": "programming" },
      // 其他关联字段...
    }
    
  • 期望返回结果(新增complete_slug):
    {
      "_id": ObjectId("1"),
      "slug": "my-story",
      "category": { "_id": ObjectId("cat1"), "slug": "tech" },
      "subcategory": { "_id": ObjectId("subcat1"), "slug": "programming" },
      "complete_slug": "tech/programming/my-story",
      // 其他关联字段...
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:58:19