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

如何将三个MongoDB查询合并为单个查询关联多集合

合并MongoDB多集合查询实现结构化结果

你可以通过MongoDB的聚合框架,使用$lookup关联多个集合,再配合$addFields、$map等操作整理嵌套结构,一次性得到目标结果。以下是具体的聚合查询语句:

db.category.aggregate([
  // 关联subcategory集合,获取当前分类下的子分类
  {
    $lookup: {
      from: "subcategory",
      localField: "_id",
      foreignField: "categoryId",
      as: "subcategory"
    }
  },
  // 关联store集合,获取当前分类下的所有店铺
  {
    $lookup: {
      from: "store",
      localField: "_id",
      foreignField: "categoryId",
      as: "store"
    }
  },
  // 先获取所有子分类的全局映射,用于店铺匹配
  {
    $lookup: {
      from: "subcategory",
      localField: null,
      foreignField: null,
      as: "allSubcategories"
    }
  },
  // 处理子分类和店铺的字段替换
  {
    $addFields: {
      "subcategory": {
        $map: {
          input: "$subcategory",
          as: "subcat",
          in: {
            _id: "$$subcat._id",
            name: "$$subcat.name",
            categoryId: { _id: "$_id", name: "$name" }
          }
        }
      },
      "store": {
        $map: {
          input: "$store",
          as: "shop",
          in: {
            _id: "$$shop._id",
            name: "$$shop.name",
            categoryId: { _id: "$_id", name: "$name" },
            subCategoryId: {
              $arrayElemAt: [
                {
                  $filter: {
                    input: "$allSubcategories",
                    cond: {
                      $eq: [
                        "$$this._id",
                        // 兼容store中拼写错误的subCatgeoryId字段
                        { $ifNull: ["$$shop.subCategoryId", "$$shop.subCatgeoryId"] }
                      ]
                    }
                  }
                },
                0
              ]
            }
          }
        }
      }
    }
  },
  // 移除临时的全局子分类数组
  {
    $project: { allSubcategories: 0 }
  },
  // 包装成目标顶层结构
  {
    $group: {
      _id: null,
      category: { $push: "$$ROOT" }
    }
  },
  {
    $project: { _id: 0, category: 1 }
  }
])

关键步骤说明:

  • $lookup:三次关联操作分别获取分类对应的子分类、分类对应的店铺,以及所有子分类的全局数据(用于店铺匹配)。
  • $map:遍历子分类和店铺数组,将原本的ID引用替换为对应文档的完整信息。
  • $filter + $arrayElemAt:根据店铺的子分类ID(兼容拼写错误的字段),从全局子分类数组中匹配对应的子分类信息。
  • $group + $project:将最终结果整理成你需要的顶层category数组结构。

内容的提问来源于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.18 05:35:05