如何用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
相关产品推荐
相关产品推荐

