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

如何用MongoDB聚合查询获取集合中的深度嵌套sub_version_code字段

MongoDB聚合查询:提取嵌套字段并重组结果

需求说明

根据指定category_id筛选集合文档,仅返回每个文档的_id,以及所有层级嵌套的sub_version_code组成的codes数组。

注意事项

你提供的预期输出中codes数组的写法不符合MongoDB语法(数组元素不能是键值对形式),实际查询返回的codes是字符串数组,结构为每个元素直接是sub_version_code的值。

解决方案

方法1:使用$unwind+$group(兼容所有MongoDB版本)

db.yourCollectionName.aggregate([
  // 筛选目标category_id的文档
  { $match: { category_id: "CC100" } },
  // 展开versions数组,将每个version转为独立文档
  { $unwind: "$versions" },
  // 展开每个version下的sub_versions数组
  { $unwind: "$versions.sub_versions" },
  // 提取需要的字段,剔除冗余数据
  {
    $project: {
      _id: 1,
      code: "$versions.sub_versions.sub_version_code"
    }
  },
  // 按_id分组,收集所有code为codes数组
  {
    $group: {
      _id: "$_id",
      codes: { $push: "$code" }
    }
  }
])

方法2:使用$reduce+$concatArrays(MongoDB 5.0+,性能更优)

如果你的MongoDB版本在5.0及以上,可以用数组操作符直接处理嵌套数组,避免多次展开:

db.yourCollectionName.aggregate([
  { $match: { category_id: "CC100" } },
  {
    $project: {
      codes: {
        $reduce: {
          input: "$versions",
          initialValue: [],
          in: {
            $concatArrays: [
              "$$value",
              // 提取当前version下所有sub_version_code
              { $map: { input: "$$this.sub_versions", as: "sub", in: "$$sub.sub_version_code" } }
            ]
          }
        }
      }
    }
  }
])

步骤解释

方法1各阶段作用

  • $match:过滤出符合category_id条件的文档,减少后续处理的数据量。
  • $unwind:连续两次展开嵌套数组,先拆versions再拆sub_versions,把多层嵌套结构转为扁平结构,方便提取字段。
  • $project:只保留_id和提取到的sub_version_code(重命名为code),去掉其他不需要的字段。
  • $group:以_id为分组键,用$push将每个分组内的code值收集成一个数组,最终得到codes字段。

方法2各阶段作用

  • $match:同方法1,筛选目标文档。
  • $project:通过$map提取每个versions元素下sub_versions的sub_version_code,得到单个version对应的code数组;再用$concatArrays将当前数组和累计数组合并;最后通过$reduce遍历所有versions元素,完成所有code的合并,直接得到最终的codes数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 10:14:58